c - 在 C 中没有锁的线程之间共享 bool 值

标签 c linux multithreading pthreads

我有两个线程,称它们为服务器线程和计算线程。服务器线程启动计算线程,将一个指向 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/

相关文章:

android - 在 Linux fedora 上获取 Google map key 时,我得到 "bash: keytool: command not found."

我可以设置工作队列的优先级吗?

c - GCC Linux C - 找不到编译对象头

c++ - 最小唯一字符

java - 如何停止使用匿名类创建的线程?

java - 连接到google fit android API不在 Activity 类中

java - TimerTask 生成错误而不执行

从删除\n 和\0 的字符串创建协议(protocol)行

linux - 流重定向顺序和操作系统执行的详细信息

linux - Ubuntu 9.04 而非 8.04 的 UDP 广播接收问题