原子比较,多处理器,C/C++(Linux)
作者:互联网
我在多处理器系统上的共享内存x中有一个变量.
void MyFunction(volatile int* x) {
if (*x != 0) {
// do something
}
}
其他进程(可能在不同的处理器上)将使用gcc内置的原子操作(如__sync_bool_compare_and_swap等)写入x.
我想我遇到了一些缓存并发问题,有时需要一些时间才能最终使用新值更新x.
我想要的是一种atomic_compare(没有交换),如果存在这样的东西?或者是“原子阅读”.最快的方法是什么? (避免互斥锁,锁等)
谢谢
编辑:
我刚刚意识到一个有点hackish的解决方法是使用__sync_val_compare_and_swap一个我知道它永远不可能的值.这会解决问题吗? (有更清洁的方式吗?)
解决方法:
新的C标准C11具有_Atomic数据类型和操作来处理这个问题.该标准尚未实现,但gcc和clang已接近它,它们已经实现了该功能.事实上,函数__sync_bool_compare_and_swap是其中的一部分.我把它包装成一个set of headers in P99,让你已经用C11接口编程了.
执行所需操作的C11函数将是atomic_load,或者如果您对一致性atomic_load_explicit有特殊要求.毫无疑问,正如您所怀疑的那样,P99将其映射到__sync_val_compare_and_swap(& x,0,0).然后,如果您查看在大多数体系结构上生成的汇编程序,这将只是在x beeing int的情况下在简单的加载操作中进行转换.但是语言并不能保证这一点,编译器需要知道这些事情并合成保证是原子的指令.
标签:c-3,c,linux,atomicity,shared-memory 来源: https://codeday.me/bug/20190826/1728221.html