multithreading - 互斥体、原子和栅栏 : what offers the best tradeoff and portability ? C++11

标签 multithreading c++11 mutex atomic memory-fences

我正在尝试深入研究,以更好地了解在使用 C++ 11 编写多线程应用程序时有多少种选择。

简而言之,到目前为止我看到了这 3 个选项:

  • 具有显式锁定和释放机制的互斥体,它们通过锁定和释放来保持线程同步,这是昂贵的并且不能保证我的代码执行的顺序,但通常这种解决方案在不同内存之间是相当可移植的模型。
  • 原子操作,由于原子= 1没有竞争的单一操作,并且它总是一致的,同步是在没有锁定和释放的情况下完成的,没有必要在没有竞争的情况下锁定,具有高度优化的原子操作,但原子仍然可以'不保证我的代码的执行顺序。
  • 栅栏,它们在我的代码中创建一个 block ,其中编译器无法对任何内容进行重新排序,灵活性较差,而且在代码维护方面它们的成本往往很高,因为我总是必须密切关注什么是确实以什么顺序执行,但它们也改进了缓存技术,在这 3 种解决方案中,它们可能是行为最可预测的一种。

这或多或少是我从有关线程和内存模型的第一课中学到的核心内容,我的问题是:

我想要使用无锁数据结构和原子来实现灵活性和良好的性能,这里的问题是,显然 X86 机器执行内存重新排序的方式与 ARM 机器不同,我希望保持我的代码可移植性至少在这两个平台上尽可能多,那么当两个平台不能保证具有相同的重新排序机制时,您可以建议采用哪种方法来编写可移植的多线程软件?或者原子操作是最好的选择,因为它是现在,我把所有这些都错了?

例如,我注意到英特尔 TBB 库(不是 C++11 代码)正在移植到 ARM/Android,并对专用于原子的部分进行了大量修改,所以也许我可以编写可移植的多线程代码在 C++11 中,具有无锁数据结构,并在稍后将我的库移植到另一个平台时优化有关原子的部分?

最佳答案

围绕多线程编程的问题不是特定于语言或特定于体系结构的。您最好首先以一般性的观点来研究它们 - 然后,作为第二步,将您的一般理解专门化到特定的语言、库、平台等。

我上学时需要的课本是:

Principles of Concurrent and Distributed Programming - Ben-Ari

我相信第二版是 2006 年。可能有更好的,但这对于初学者来说应该足够了。

关于multithreading - 互斥体、原子和栅栏 : what offers the best tradeoff and portability ? C++11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17325998/

相关文章:

android - 如何将 byte[] 类型的参数传递给 AsyncTask 函数?

c++ - 构造函数 wxTextValidator 的实例没有匹配实例

c++ - 如何将可变参数模板参数绑定(bind)到函数

c++ - 在 C++ 中从输入函数获取参数类型的模板函数出错?

golang mutex 有时有效?

c - linux下如何创建一个带超时的文件锁

c++ - C多线程编程中的文件输入和输出(windows)

c - 更好地锁定共享资源,或者有一个线程来完成请求?

C++互斥锁定线程优先级

c++ - 高级比较和交换 (CAS) 函数?