【发布时间】:2010-08-10 23:22:25
【问题描述】:
在我工作的一个程序中,我有很多代码如下:
pthread_mutex_lock( &frame->mutex );
frame->variable = variable;
pthread_mutex_unlock( &frame->mutex );
如果中间指令可以替换为原子存储,这显然是在浪费 CPU 周期。我知道 gcc 非常有能力做到这一点,但是我还没有找到很多关于这种简单的线程安全原子操作的文档。如何用原子操作替换这组代码?
(我知道简单的存储理论上应该是原子的,但我不想希望优化器不会在过程中的某个时刻搞砸它们的原子性。)
澄清:我不需要它们是严格原子的;这些变量仅用于线程同步。也就是说,线程 B 读取值,检查它是否正确,如果不正确,它就休眠。所以即使线程 A 更新了值而线程 B 没有意识到它的更新,这也不是问题,因为这只是意味着线程 B 在它不需要的时候休眠了,当它醒来时,值会是正确的。
【问题讨论】:
-
自内核 2.6 以来,当互斥锁免费时,互斥锁的成本几乎为零。无论如何,“__sync_lock_test_and_set”(从 gcc 4.1 开始)应该可以解决问题,这不是在这种情况下可以使用的唯一函数。
-
__atomic_store 或 __atomic_store_n 似乎更合适。
标签: multithreading gcc atomic