c - 如何在 C 中实现无锁共享标志?

标签 c sync lock-free

我有一个生产者一个消费者模型,我需要生产者在数据可用时设置一个标志。我怀疑我可以在不锁定共享标志的情况下逃脱,因为:

  • 生产者在设置之前从不检查值
  • 偶尔错过对标志的更新不是问题(尽管我也可以使用原子操作来避免这种情况?)。

所以我的问题是,我该如何实现它?我对 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/

相关文章:

java - 何时/不使用同步适配器

linux - 如何实现 ABA 解决方案?

multithreading - CPU 寄存器和缓存一致性

与库链接的 C 程序

python - 无论如何,C 中是否会自动检测插入值的数据类型,然后将该值存储在该特定数据类型中?

java - Android - 如何在指定时间在后台下载数据

ubuntu - 同步 FTP 和本地文件夹 - Ubuntu

c++ - test_and_set 线程的这种用法安全吗?

c - net-snmp mib 模块处理程序/回调示例?

c - 在 Linux 内核模块中设置动态变量