我在多处理器系统上的共享内存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)


基础教程推荐
- C++实战之二进制数据处理与封装 2023-05-29
- centos 7 vscode cmake 编译c++工程 2023-09-17
- C语言编程C++旋转字符操作串示例详解 2022-11-20
- [c语言-函数]不定量参数 2023-09-08
- C语言 详解字符串基础 2023-03-27
- C语言实现宾馆管理系统课程设计 2023-03-13
- [C语言]二叉搜索树 2023-09-07
- 带你深度走入C语言取整以及4种函数 2022-09-17
- 全面了解C语言 static 关键字 2023-03-26
- C++实现ETW进行进程变动监控详解 2023-05-15