Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ pthread_互斥锁是否比用户在代码中设置的内存屏障提供更高的性能_C++_Performance_Pthreads_Asmx_Mutex - Fatal编程技术网

C++ pthread_互斥锁是否比用户在代码中设置的内存屏障提供更高的性能

C++ pthread_互斥锁是否比用户在代码中设置的内存屏障提供更高的性能,c++,performance,pthreads,asmx,mutex,C++,Performance,Pthreads,Asmx,Mutex,问题背景 < >代码与C++实现有关。我们有代码库,对于某些关键实现,我们使用asm volatile(“mfence”:“memory”) 我对记忆障碍的理解是- 它用于确保指令集的完整/有序执行 这将有助于避免古典音乐 问题 如果我们使用内存围栏来避免线程同步问题,那么pthread\u mutext是否比内存屏障快?我读过的内容表明了这一点 附言: > P>在代码中,使用了代码ASM FAST(“MARVELD”:“内存”)在10-15行C++代码(成员函数)之后使用。所以我

问题背景

< >代码与C++实现有关。我们有代码库,对于某些关键实现,我们使用
asm volatile(“mfence”:“memory”)

我对记忆障碍的理解是-

  • 它用于确保指令集的完整/有序执行
  • 这将有助于避免古典音乐
问题

  • 如果我们使用内存围栏来避免线程同步问题,那么
    pthread\u mutext
    是否比内存屏障快?我读过的内容表明了这一点

附言:

    > P>在代码中,使用了<>代码ASM FAST(“MARVELD”:“内存”)在10-15行C++代码(成员函数)之后使用。所以我的疑问是,在用户实现的代码中,内存同步的mutext实现可能比MB实现的性能更好(w.r.t范围为MB)

  • 我们正在使用SUSELinux10、2.6.16.46、smp#1、x64_86和四核处理器


pthread mutex保证比内存限制指令慢(我不能说慢多少,这完全取决于平台)。原因很简单,因为为了兼容posix互斥,它们必须包括内存保证。posix互斥锁有很强的内存保证,因此我不知道如果没有这样的围栏,它们将如何实现*

如果你在寻找实用的建议,我会在很多地方使用fences而不是mutex,并且经常对它们进行计时。在Linux上,pthread_互斥体与原始内存隔离相比非常慢(当然,它们做的更多,所以要注意实际比较的内容)

但是请注意,某些原子操作,特别是C++11中的原子操作,可能而且肯定会比您在所有地方使用围栏更快。在这种情况下,编译器/库理解体系结构,不需要使用完整的围栏来提供内存保证

还要注意,我说的是锁本身的低级别性能。您需要将配置文件设置为纳秒级


*可以想象一个互斥系统忽略某些类型的内存,并选择更宽松的锁定实现(例如依赖于正常内存和忽略特殊标记内存的顺序保证)。但是,我认为这样的实现是无效的。

如果没有更多的细节,例如“有多少线程试图获取互斥体”、“多久获取一次互斥体”、“互斥体是否在不同的方法之间广泛共享”、“互斥体是在类级别还是在实例级别”,这个问题几乎不可能回答,等等。我想我可能更担心手动内存围栏在同步方面是否做得对。实现同步原语很难做到正确;出于性能原因编写自己的代码可能会在其他方面给您带来麻烦。