我想在两个pthread之间实现一个无锁的单生成器,单用户循环队列;在C中,在ARM Linux上。
队列将保存字节,生产者将memcpy()内容,消费者将()将它们写入文件。
认为我可以存储整个头部和尾部偏移并且一切都能正常工作,这是天真的吗? 我想知道编译器优化这样的事情,这意味着我的头/尾写入位于寄存器中,对另一个线程不可见,或者在某处需要内存屏障。
答案 0 :(得分:4)
pthreads的内存一致性模型不能为构建无锁算法提供任何帮助。您自己 - 您将不得不使用您的架构提供和要求的任何原子指令和内存屏障。您还必须查阅编译器文档以确定如何请求编译器障碍。
使用由互斥锁和条件变量保护的普通队列实现几乎肯定会更好 - 如果队列只存储指向正在写入文件的缓冲区(而不是数据本身)的指针,那么锁定争用就不应该这是一个问题,因为只有在从队列中添加或删除指针时才需要保持锁定。