我有两个线程,称它们为服务器线程和计算线程。服务器线程启动计算线程,将一个指向 bool 变量的指针传递给它,即“停止标志”。当服务器线程将停止标志设置为真时,计算线程应退出其计算循环并从运行函数返回。
我的问题是,是否有任何方法可以在两个线程之间安全地共享该标志,无需使用任何类型的锁(互斥锁、信号量等)?请记住:
- Flag 将被设置为 true 一次
- 一旦设置为 true,Flag 将永远不会设置回 false
- 只有一个服务器线程,也只有一个计算线程
在这种情况下,我将“安全”定义为在服务器线程中将标志设置为 true 的任何方法,保证在合理的时间内在计算线程中反射(reflect)真实值。 (如果你的回答包含“最终”这个词,它可能不满足“合理的时间”)。
我对可移植和非可移植解决方案都感兴趣。我在 Linux 平台上运行,但除此之外还有一些灵 active :GCC、Clang、内核版本、C 标准版本等。
最佳答案
在这种情况下,将变量定义为 volatile
就足够了。
通过单次写入,不可能发生损坏。
无法保证写入可见所需的时间,但您不需要。
volatile
防止有害的优化——如果编译器发现一个变量没有被修改,它可能会认为它不需要从内存中重新读取它。 volatile
阻止了这种情况。
关于c - 在 C 中没有锁的线程之间共享 bool 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20100072/