【问题标题】:Are mutex changes broadcast to other cores on a multicore system?互斥量更改是否会广播到多核系统上的其他内核?
【发布时间】:2014-12-12 01:39:02
【问题描述】:

我想用多个线程操作基于树的数据结构,并用互斥锁保护每个节点。 目标架构有数百个线程并在(虚拟)共享内存上运行。

如果 CPU 1 在要操作的节点上获得锁,这种状态互斥锁的更改是否会主动传达给所有其他内核,或者仅在请求时传达?

我假设与共享变量的所有其他更改一样,互斥锁更改被写入主内存。其他 CPU 的缓存根据其策略失效和替换。互斥锁的值只有在另一个 CPU 想要锁定它或者如果他们的缓存替换策略从内存中加载它时才会被另一个 CPU 访问。

这是正确的,还是互斥体被区别对待并立即广播或在请求之前保留? 我想避免每次锁定节点时使数百个缓存失效。 This question 表示每次使用互斥体时都会锁定总线,这似乎没有问题。

编辑

我问的是 GCC 4.8 实现的 C++11 互斥锁。 (据我所知,英特尔编译器还使用 GCC 库来处理与 C++11 规范有关的任何事情。) 我担心的是开销而不是正确性。

【问题讨论】:

  • 您是在询问具体的互斥锁实现吗?
  • 谢谢,我忘了说。已编辑的问题。

标签: c++ multithreading mutex multicore


【解决方案1】:

在任何内核上运行的所有线程都将与互斥锁协作,正如您所期望的那样。您无需采取任何特殊措施。

您可以合理地期望在幕后涉及一些内存栅栏,但这是一个实现细节,而不是您通常想要关心的事情。

旁注:如果您可以完全并行化您的流程(即一个线程不依赖于另一个线程生成的数据),那么您可能会发现为每个线程提供其自己的数据副本(以及因此根本不需要互斥锁)将大大提高性能。

【讨论】:

  • 谢谢!我并不担心正确性,但你的旁注是一个有趣的建议。
猜你喜欢
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 2021-05-21
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多