在与原子加载和存储同步的线程之间共享变量是否安全?

在GCC下在GNU /
Linux下编译的C程序中,使用非原子和非易失性变量在线程之间共享数据是安全的(在某种意义上它不会引入意外行为),前提是使用那些线程的线程变量是通过原子载荷和存储来同步的吗?如果没有,我应该用什么呢?

例如,GCC是否保证以下代码将按预期工作(thread_2总是返回1)?假设从不同的线程调用这两个函数.如果它是使用C11原子原语编写的,如果我使用POSIX线程互斥来同步,或者我使用POSIX信号量,它会有什么不同吗?我仅将以下代码作为特定案例包含在内.

int data = 0;
int flag = 0;

int thread_1 (void) {
    data = 1;
    __atomic_store_n (&flag, 1, __ATOMIC_RELEASE);
    return -1;
}

int thread_2 (void) {
    while (!__atomic_load_n (&flag, __ATOMIC_ACQUIRE));
    return data;
}

提前致谢.

最佳答案 根据
GCC Wiki,这应该是安全的,因为aquire / release内存模型保证线程1中的数据的存储将在原子存储之前发生,因为数据不是原子变量.

“Any store before an atomic operation must be seen in other threads that synchronize.”

线程2将始终等待(使用busy waiting),直到flag的值与零不同,然后返回1.

点赞