C/C++共享内存,原子操作,Linux
C/C++ shared memory, atomic operations, Linux
我正在多处理器服务器上使用共享内存进行进程间通信。我已经将代码简化为以下内容:
struct MyStruct {
uint64_t x;
};
volatile MyStruct* my_struct; // initialized elsewhere
void MyFunction(uint64_t y) {
while (true) {
uint64_t current_x = my_struct->x;
if (__sync_bool_compare_and_swap(&my_struct->x, current_x, y)) {
DoWork(current_x, y); // do work here depending on current_x and y
return;
}
}
}
我的问题是:这个代码正确吗?
特别是,我需要添加吗
__sync_synchronize()
在线之前
uint64_t current_x = my_struct->x
,或者这是多余的,因为下一行的原子CAS无论如何都有效地做到了这一点?正如您所看到的,我实际上想要的是__sync_lock_test_and_set功能。然而,从http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Atomic-Builtins.html看起来这个函数可能并不总是像预期的那样工作。
while (true) {
uint64_t current_x = my_struct->x;
/* CAVEAT: my_struct may point to something different now */
if (__sync_bool_compare_and_swap(&my_struct->x, current_x, y)) {
如果您不关心my_struct
可能指向不同的结构,但与原始结构具有相同的x
值,那么代码看起来很好。您的代码似乎暗示它是可以的,因为您的DoWork
只关心current_x
和y
。
相关文章:
- 对OpenMP reduction子句中的变量执行原子操作
- 如何在C++中进行像素操作? - Linux
- C++:将值赋值给原始数据类型(例如布尔值)是原子操作吗?
- 标记为 std::memory_order_seq_cst 的单个原子操作是否会在所有位置触发顺序一致性?
- 对单个变量的原子操作
- 对于 CPU 无法原子操作的类型,std::atomic 有什么意义?
- 为什么互斥对象与原子操作不同,前者是操作系统级,后者是处理器级
- 原子变量的多重赋值是原子操作吗?
- 对标准类型使用原子操作
- 共享指针,C 版本的原子操作
- 即使在单线程程序中,共享指针是否在引用计数中使用原子操作
- 原子操作传播/可见性(原子负载与原子RMW负载)
- 为什么原子操作需要独家的缓存访问
- 在英特尔上自然对齐的POD类型的保证原子操作
- C++ 如何编写原子操作
- 原子操作示例'Concurrency in Action'的正确性
- 嵌套原子操作是否保证为原子操作
- 如何实现原子操作
- 如何使用原子操作fetch_or或test_and_set在指针中设置一点,而在C 11中不使用Amberare_
- C/C++共享内存,原子操作,Linux