在我编写的一个程序中,我有很多代码如下:
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 章用于原子内存访问的内置函数 http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Atomic-Builtins.html- 对于其他 gcc 版本,请检查您的文档。它应该在第 5 章 - C 语言家族的扩展中。
顺便说一句,C 编译器绝对不保证简单存储操作是原子的。你不能依赖这个假设。为了使机器操作码能够原子执行,它需要 LOCK 前缀。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)