我正在尝试深入研究,以更好地了解在使用 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/