在与原子加载和存储同步的线程之间共享变量是否安全?
Is it safe to share variables among threads synchronized with atomic loads and stores?
在 GNU/Linux 下 GCC 下编译的 C 程序中,使用非原子和非易失性变量在线程之间共享数据是否安全(在不会引入意外行为的意义上)如果使用这些变量的线程是通过原子加载和存储同步的?如果没有,我应该用什么代替?
对于实例,GCC 是否保证以下代码将按预期工作(thread_2 始终returns 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 中对 data
的存储将happen-before flag
的原子存储,因为 data
不是原子变量。
"Any store before an atomic operation must be seen in other threads that synchronize."
线程 2 将始终等待(使用 busy waiting)直到 flag
的值不同于零,然后 return 1.
在 GNU/Linux 下 GCC 下编译的 C 程序中,使用非原子和非易失性变量在线程之间共享数据是否安全(在不会引入意外行为的意义上)如果使用这些变量的线程是通过原子加载和存储同步的?如果没有,我应该用什么代替?
对于实例,GCC 是否保证以下代码将按预期工作(thread_2 始终returns 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 中对 data
的存储将happen-before flag
的原子存储,因为 data
不是原子变量。
"Any store before an atomic operation must be seen in other threads that synchronize."
线程 2 将始终等待(使用 busy waiting)直到 flag
的值不同于零,然后 return 1.