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

标签 c multithreading gcc pthreads atomic

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

例如,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 中对 data 的存储将发生在原子存储到 flag as data 不是原子变量。

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

线程 2 将一直等待(使用 busy waiting )直到 flag 的值不为零,然后返回 1。

关于c - 在与原子加载和存储同步的线程之间共享变量是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28034290/

相关文章:

ctags 没有找到一个函数

c - 从c中的stdin读取字符串

c - 单个 sqrt() 的运行速度如何比放入 for 循环时慢两倍

c++ - 在 std::thread 中等待条件 A 或条件 B

c - 带有相应标志的 "c99"和 "gcc"命令有什么区别?

c - 从挂起恢复时出现段错误

c - 套接字编程疑难解答

python - 通过 Python API 使用 C 库时遇到问题 : What am I doing wrong?

android - 如果我的 Android 应用程序没有 UI,我应该在单独的线程中工作吗?

类成员变量的 C++ 线程访问问题