Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在与原子加载和存储同步的线程之间共享变量安全吗?_C_Multithreading_Gcc_Pthreads_Atomic - Fatal编程技术网

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

C 在与原子加载和存储同步的线程之间共享变量安全吗?,c,multithreading,gcc,pthreads,atomic,C,Multithreading,Gcc,Pthreads,Atomic,在GNU/Linux中,在GCC下编译的C程序中,如果使用非原子和非易失性变量的线程通过原子加载和存储进行同步,那么使用非原子和非易失性变量在线程之间共享数据是否安全?。如果不是,我应该用什么来代替 对于实例,GCC是否保证以下代码将按预期工作(线程2始终返回1)?。假设这两个函数都是从不同的线程调用的。如果它是使用C11原子原语编写的,如果我使用POSIX线程互斥来同步,或者如果我使用POSIX信号量,会有什么不同吗?。我仅将以下代码作为一个特定案例 int data = 0; int fla

在GNU/Linux中,在GCC下编译的C程序中,如果使用非原子和非易失性变量的线程通过原子加载和存储进行同步,那么使用非原子和非易失性变量在线程之间共享数据是否安全?。如果不是,我应该用什么来代替

对于实例,GCC是否保证以下代码将按预期工作(线程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;
}
提前感谢。

根据,这应该是安全的,因为获取/释放内存模型保证线程1中的存储到
数据
将发生在原子存储到
标志
之前,因为
数据
不是原子变量

“原子操作之前的任何存储都必须在其他同步线程中看到。”


线程2将始终等待(使用)直到
标志
的值不同于零,然后返回1。

GCC允许任何长度为1、2、4或8字节的整数标量或指针类型。如果体系结构支持“\uuuu int128”(请参阅“\uuuu int128”),则也允许使用16字节整数类型。@Snps:谢谢,我刚刚添加了缺少的参数。@2501:谢谢您的评论,但是,它没有回答我的问题,也没有与之直接相关。基本上,这些伪函数就是为了这个而设计的。它们是C11原子的低级实现。如果不使用C11,您应该注意的唯一一件事是,您没有将变量限定为
\u Atomic
,没有任何东西可以保护您不在代码的其他地方以非原子方式使用这些变量。如果你这样做,你可能会有令人惊讶的结果。所以最好切换到C11,我认为clang和GCC4.9现在就可以实现了。@JensGustedt Ok。谢谢你的回答。