互斥锁更改是否广播到多核系统上的其他内核
Are mutex changes broadcast to other cores on a multicore system?
我想用多个线程操作一个基于树的数据结构,并使用互斥锁保护每个节点。目标体系结构有几百个线程,并在(虚拟(共享内存上运行。
如果 CPU 1 在要操作的节点上获取锁,则此状态互斥锁的更改是主动传达给所有其他内核,还是仅在请求时才通信?
我假设像共享变量的所有其他更改一样,互斥锁更改被写入主内存。其他 CPU 的缓存将失效并根据其策略进行替换。仅当另一个 CPU 想要锁定互斥锁的值或缓存替换策略从内存加载互斥锁的值时,它才会访问该值。
这是正确的,还是互斥体被区别对待并立即广播或保留直到请求?我想避免每次锁定节点时使数百个缓存失效。此问题表示每次使用互斥锁时总线都被锁定,这似乎不是问题。
编辑
我问的是GCC 4.8实现的C++11互斥体。(据我所知,英特尔编译器还使用 GCC 库来处理与 C++11 规范相关的任何内容。我担心开销多于正确性。
任何内核上运行的所有线程都将如您所期望的那样与互斥锁合作。您无需执行任何特殊操作。
您可以合理地期望在幕后涉及一些内存围栏,但这是一个实现细节,而不是您通常想要关注的事情。
旁注:如果你可以完全并行化你的进程(即一个线程不依赖于另一个线程产生的数据(,那么你可能会发现给每个线程提供自己的数据副本(因此根本不需要互斥锁(会给你带来很大的性能改进。
相关文章:
- C++事件系统 - 多态事件和事件处理程序
- 如何使用多核代替多核进行编程
- 多核 CPU 上 32 位读取的原子性
- 具有自动跨界的多核处理器上的精确C/C 时钟
- 非CS人员需要了解线程是如何工作的,因为它与多核处理器有关
- 多核线程C++
- 用C++实现多核编程中线程数的获取
- 是具有多核处理器的 c++ 运算符 |= 原子
- 多线程和多核差异
- 这个线程池/多核模拟有什么问题
- 如何在多核系统上实现信号量
- 在低功耗多核微控制器中使用全局变量不好吗?(C++)
- 在多核盒上使用繁忙循环应用程序
- C++:Ubuntu 多核服务器上的 CPU 使用率低
- 如何在QThread中使用OpenMP功能强制使用多核
- 即使在多核上下文中,是否有任何 std::chrono 线程安全保证
- 互斥锁更改是否广播到多核系统上的其他内核
- 在VS2010调试模式下启用多核编译
- 选择“多核环境下的v/s多线程”
- 如何度量在多核系统上运行的多个应用程序之间的消息延迟