c++ - pthread_mutex 锁是否比用户在代码中强加的内存屏障提供更高的性能

标签 c++ performance pthreads asmx mutex

问题背景

有问题的代码与 C++ 实现相关。我们有代码库,对于某些关键实现,我们确实使用asm volatile ("mfence":"memory")

我对内存障碍的理解是 -

问题


附注:

  • 在我们的代码中,在 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/

相关文章:

performance - 加速 gz 文件上的 sed

c++ - 如何多线程呢?

c++ - 确定整数是否在具有已知值集的两个整数(包括)之间的最快方法

C++ - 套接字服务器线程

c++ - 我的模板语法有什么问题?

java - 使用 Jmeter 将文件从本地计算机传输到服务器

c++ - 在 C++ 中生成随机数在计算上有多昂贵?

c - 获取线程最后调度的 CPU/核心

c - 不同线程中的全局变体是否意味着不同的变体?

c++ - 存储顶点的所有邻居,快速找到顶点的邻居