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