问题背景
有问题的代码与 C++ 实现相关。我们有代码库,对于某些关键实现,我们确实使用asm volatile ("mfence":"memory")
。
我对内存障碍的理解是 -
- 用于确保指令集的完整/有序执行。
- 这将有助于避免经典 thread synchronization problem - Wiki link 。
问题
- 如果我们使用内存栅栏来避免线程同步问题,
pthread_mutext
是否比内存屏障更快?我读过的内容表明 pthread mutex uses memory synchronization 。
附注:
在我们的代码中,在 10-15 行 C++ 代码(成员函数)之后使用
asm volatile ("mfence":"memory")
。所以我的疑问是 - 内存同步的互斥实现可能比用户实现的代码中的 MB 提供更好的性能(w.r.t MB 范围)。我们使用的是带有四核处理器的 SUSE Linux 10、2.6.16.46、smp#1、x64_86。
最佳答案
pthread 互斥保证比内存栅栏指令慢(我不能说慢多少,这完全取决于平台)。原因很简单,为了兼容 posix 互斥体,它们必须包含内存保证。 posix 互斥体具有强大的内存保证,因此我看不出如果没有这样的栅栏,它们将如何实现*。
如果您正在寻找实用的建议,我在很多地方使用栅栏而不是互斥体,并且经常对它们进行计时。与原始内存栅栏相比,pthread_mutexes 在 Linux 上非常慢(当然,它们做了更多的事情,所以要小心你实际比较的内容)。
但请注意,某些原子操作,特别是 C++11 中的原子操作,可以而且肯定会比使用所有栅栏更快。在这种情况下,编译器/库了解架构,不需要使用完整的栅栏来提供内存保证。
另请注意,我所说的是锁本身的非常低级的性能。您需要分析到纳秒级别。
*可以想象一个互斥系统忽略某些类型的内存并选择更宽松的锁定实现(例如依赖正常内存的排序保证并忽略特殊标记的内存)。但我认为这样的实现是无效的。
关于c++ - pthread_mutex 锁是否比用户在代码中强加的内存屏障提供更高的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10383055/