我有一个生产者一个消费者模型,我需要生产者在数据可用时设置一个标志。我怀疑我可以在不锁定共享标志的情况下逃脱,因为:
- 生产者在设置之前从不检查值
- 偶尔错过对标志的更新不是问题(尽管我也可以使用原子操作来避免这种情况?)。
所以我的问题是,我该如何实现它?我对 volatile 关键字以及 __sync_synchronize() 之类的东西的理解充其量是微不足道的,所以假设我知之甚少。具体来说,我希望能够确保标志的更改及时在另一个线程中可见。
编辑:我在 Linux 上使用 GCC。
最佳答案
使用两个变量:
volatile size_t elements_produced; // producer increments it when data is available
volatile size_t elements_consumed; // consumer increments it
新数据恰好在 elements_produced != elements_consumed
时可用。
如果您需要无限数量,则在更新时另外对其进行修改。
produce(...) {
elements_produced = (elements_produced + 1) % (max_elements_in_queue + 1);
}
consume(...) {
elements_consumed = (elements_consumed + 1) % (max_elements_in_queue + 1);
}
不需要锁或原子。
这是单一生产者、单一消费者圆形环形缓冲区的标准实现。
关于c - 如何在 C 中实现无锁共享标志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12788424/