在 Internet 上,可以找到许多关于volatile
在并行编程中使用关键字的争论,有时争论不休。
关于这个主题的更值得信赖的讨论之一似乎是Arch Robison 的这篇文章。他使用的示例是将值从一个线程传递到另一个线程的任务:
线程 1. 计算一个矩阵乘积并将其提供给线程 2,线程 2 用它做其他事情。矩阵是可变M
的,标志是volatile
指针R
。
- 线程 1 乘以计算矩阵乘积 M 并以原子方式将 R 设置为指向 M。
- 线程 2 等到 R!=NULL 然后使用 M 作为一个因子来计算另一个矩阵乘积。
换句话说,M 是一条消息,R 是一个就绪标志。
作者声称,虽然将 R 声明为 volatile 将解决将更改从线程 1 传播到线程 2 的问题,但它不能保证发生这种情况时 M 的值是多少。分配给R
和M
可以重新排序。因此,我们需要在 pthreads 之类的库中同时使用M
和R
volatile 或使用一些同步机制。
我的问题是,如何在 C 中执行以下操作
1)如何在两个线程之间共享一个标志 - 如何原子地分配给它,确保另一个线程将看到更改并测试另一个线程中的更改。在这种情况下使用 volatile 合法吗?或者某些库能否提供概念上更好或更快的方法,可能涉及内存屏障?
2)如何正确地执行 Robison 的示例,以及如何将矩阵 M 从一个线程发送到另一个线程并安全地进行(最好使用 pthreads 便携)