gpt4 book ai didi

c++ - C/C++共享内存、原子操作、Linux

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:11:32 26 4
gpt4 key购买 nike

我在多处理器 服务器上使用共享内存进行进程间通信。我已将代码简化为以下内容:

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_xy

关于c++ - C/C++共享内存、原子操作、Linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11405672/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com