我在多处理器系统上的共享内存x中有一个变量.void MyFunction(volatile int* x) {if (*x != 0) {// do something}}其他进程(可能在不同的处理器上)将使用gcc内置的原子操作(如__sync_bool_compare_and_swap等)写入x...
我在多处理器系统上的共享内存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/C++(Linux)


- 我应该为我的项目使用相对包含路径,还是将包含目录放在包含路径上? 2022-10-30
- ubuntu下C/C++获取剩余内存 2023-09-18
- C++ 数据结构超详细讲解顺序表 2023-03-25
- C语言手把手带你掌握带头双向循环链表 2023-04-03
- c++ const 成员函数,返回一个 const 指针.但是返回的指针是什么类型的 const? 2022-10-11
- C语言qsort()函数的使用方法详解 2023-04-26
- 详解C语言中sizeof如何在自定义函数中正常工作 2023-04-09
- Qt计时器使用方法详解 2023-05-30
- Easyx实现扫雷游戏 2023-02-06
- C语言详解float类型在内存中的存储方式 2023-03-27