我想用多个线程操作一个基于树的数据结构,并使用互斥锁保护每个节点。目标体系结构有几百个线程,并在(虚拟(共享内存上运行。
如果 CPU 1 在要操作的节点上获取锁,则此状态互斥锁的更改是主动传达给所有其他内核,还是仅在请求时才通信?
我假设像共享变量的所有其他更改一样,互斥锁更改被写入主内存。其他 CPU 的缓存将失效并根据其策略进行替换。仅当另一个 CPU 想要锁定互斥锁的值或缓存替换策略从内存加载互斥锁的值时,它才会访问该值。
这是正确的,还是互斥体被区别对待并立即广播或保留直到请求?我想避免每次锁定节点时使数百个缓存失效。此问题表示每次使用互斥锁时总线都被锁定,这似乎不是问题。
编辑
我问的是GCC 4.8实现的C++11互斥体。(据我所知,英特尔编译器还使用 GCC 库来处理与 C++11 规范相关的任何内容。我担心开销多于正确性。
任何内核上运行的所有线程都将如您所期望的那样与互斥锁合作。您无需执行任何特殊操作。
您可以合理地期望在幕后涉及一些内存围栏,但这是一个实现细节,而不是您通常想要关注的事情。
旁注:如果你可以完全并行化你的进程(即一个线程不依赖于另一个线程产生的数据(,那么你可能会发现给每个线程提供自己的数据副本(因此根本不需要互斥锁(会给你带来很大的性能改进。