我想使用多个线程操纵基于树的数据结构,并使用互斥锁保护每个节点。 目标体系结构有几百个线程,并在(虚拟)共享内存上运行。
如果CPU 1获取了要操作的节点的锁定,是否会将状态互斥锁的更改主动或仅在请求时传递给所有其他核心?
我认为,与共享变量的所有其他更改一样,互斥锁更改将写入主内存。其他CPU的高速缓存将失效并根据其策略进行替换。互斥锁的值只有在想要锁定它或其缓存替换策略从内存中加载时才由另一个CPU访问。
这是正确的,还是以不同的方式处理互斥,并在请求之前立即广播或保留? 我希望每次锁定节点时都要避免使数百个缓存失效。 This question表示每次使用互斥锁时总线都被锁定,这似乎不是问题。
修改
我询问GCC 4.8实现的C ++ 11互斥体。 (据我所知,英特尔编译器也使用GCC库来处理与C ++ 11规范有关的任何事情。) 我担心的是开销而不是正确性。
答案 0 :(得分:2)
任何内核上运行的所有线程都会像您期望的那样与互斥锁协作。你不需要采取任何特别的行动。
您可以合理地预期会有一些内存围栏,但这是一个实现细节,而不是您通常想要关注的内容。
旁注:如果您可以完全并行化您的流程(即一个线程不依赖于另一个线程产生的数据),那么您可能会发现为每个线程提供了自己的 copy 数据(和因此,根本不需要互斥体)将为您提供非常好的性能。