在我工作的程序中,我有很多代码如下:
pthread_mutex_lock( &frame->mutex ); frame->variable = variable; pthread_mutex_unlock( &frame->mutex );
如果中间指令可以用原子存储替换,这显然是浪费CPU周期.我知道gcc非常有能力,但是我没能找到关于这种简单的线程安全原子操作的文档.我如何用原子操作替换这组代码?
(我知道简单商店在理论上应该是原子的,但我不希望希望优化器在这个过程的某个时刻不会搞砸他们的原子性.)
澄清:我不需要它们是严格的原子; 这些变量仅用于线程同步.也就是说,线程B读取值,检查它是否正确,如果不正确,它会休眠.因此,即使线程A更新了值并且线程B没有意识到它的更新,这也不是问题,因为这只是意味着线程B在它不需要时就会休眠,并且当它被唤醒时,值将会是对的.
你可以查看gcc文档.对于当前的gcc版本(4.3.2),它将是第5.47章用于原子内存访问的内置函数 - 对于其他gcc版本,请查看您的文档.它应该在第5章C语言家族的扩展中.
顺便说一句,C编译器绝对不能保证简单的存储操作是原子的.你不能依赖这个假设.为了使机器操作码以原子方式执行,它需要LOCK前缀.
在某一点上,C中的原子操作是通过atomic.h头直接从内核源提供的.
但是,直接在用户空间代码中使用内核头文件是一种非常糟糕的做法,因此不久前删除了atomic.h头文件.相反,我们现在可以使用"GCC Atomic Builtins",这是一种更好,更可靠的方法.
Tudor Golubenco在他的博客上提供了非常好的解释.他甚至为初始的atomic.h文件提供了一个替代品,以防你有一些需要它的代码.
不幸的是我是stackoverflow的新手,所以我只能在我的评论中使用一个链接,所以检查Tudor的帖子并开悟.