【发布时间】:2012-10-08 19:45:50
【问题描述】:
我有一个生产者一消费者模型,我需要生产者在数据可用时设置一个标志。我怀疑我可以在没有锁定共享标志的情况下逃脱,因为:
- 生产者在设置之前从不检查值
- 偶尔错过标志更新不是问题(尽管我也可以使用原子操作来避免这种情况?)。
所以我的问题是,我该如何实现呢?我对 volatile 关键字的理解,以及 __sync_synchronize() 之类的东西充其量是微不足道的,所以假设我知道的很少。具体来说,我希望能够确保及时在其他线程中看到对标志的更改。
编辑:我在 Linux 上使用 GCC。
【问题讨论】:
-
测试和设置指令? penguin.cz/~literakl/intel/b.html#BTS 使用一点内联汇编应该不会太难。
-
不知道。这是否允许我假设其他线程中的可见性?还是允许编译器在生产者线程中使用标志的本地副本?此外,GCC 具有用于原子操作的内置函数。
-
它是为此目的而设计的,所以它应该很快。理论上。我从来不需要编写自己使用它的软件,我只知道它存在。
-
在 C11 中,使用
atomic_flag变量类型和atomic_flag_test_and_set函数。详见 7.17.8.1。 -
@KerrekSB,太好了,我以前没见过。谢谢。有没有办法在 C99 中模拟它,我认为我使用的不是最新版本的 GCC。