c - 带 pthreads 的无锁循环队列。有什么要注意的吗?

标签 c linux pthreads queue lockless

我想在两个 pthread 之间实现一个无锁的单生产者、单消费者循环队列;在 C 语言中,在 ARM Linux 上。

队列将保存字节,生产者将 memcpy() 东西放入,而消费者将 write() 它们输出到文件。

认为我可以将头部和尾部的偏移量存储在整数中并且一切都会正常工作,这是天真的想法吗? 我想知道诸如编译器优化之类的事情,这意味着我的头/尾写入位于寄存器中并且对其他线程不可见,或者在某处需要内存屏障。

最佳答案

pthreads 的内存一致性模型不会为您构建无锁算法提供任何帮助。你是你自己的 - 你将不得不使用你的架构提供和要求的任何原子指令和内存屏障。您还必须查阅编译器文档以确定如何请求编译器屏障。

使用受互斥量和条件变量保护的普通队列实现几乎肯定会更好 - 如果队列只存储指向正在写出到文件的缓冲区的指针(而不是数据本身),那么锁争用应该这会成为一个问题,因为只有在队列中添加或删除指针时才需要持有锁。

关于c - 带 pthreads 的无锁循环队列。有什么要注意的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6452684/

相关文章:

c++ - 传递 malloc 指针给我错误

c - 我的字符设备打不开

linux - 阅读在此处文档中被跳过

c - 多线程程序在完成之前卡住

无法编译 pthread 调度 API

同时使用 c89 和 POSIX

c - fgetchar() 的功能是什么?使用标准输入之前是否需要刷新它?

Linux 发行版容易受到缓冲区溢出的影响

regex - 如何在 shell 脚本中使用正则表达式从 URL 中提取字符串字段值?

c - pthread_join() 中的段错误