我在多处理器系统上的共享内存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-07-20
- C++详细实现完整图书管理功能 2023-04-04
- C/C++编程中const的使用详解 2023-03-26
- C++使用easyX库实现三星环绕效果流程详解 2023-06-26
- 如何C++使用模板特化功能 2023-03-05
- C利用语言实现数据结构之队列 2022-11-22
- C语言基础全局变量与局部变量教程详解 2022-12-31
- 详解c# Emit技术 2023-03-25
- C++中的atoi 函数简介 2023-01-05
- C语言 structural body结构体详解用法 2022-12-06