在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.