multithreading - __ATOMIC_RELAXED 是什么意思?

标签 multithreading gcc

在 GCC atomic 内置中,我发现 __atomic_exchange 函数确实有第三个参数 int memorder,它可以采用值之一 __ATOMIC_RELAXED , __ATOMIC_SEQ_CST , __ATOMIC_ACQUIRE , __ATOMIC_RELEASE , 和 __ATOMIC_ACQ_REL .

__ATOMIC_RELAXED: Implies no inter-thread ordering constraints.



我不确定这怎么会发生,这不应该是原子操作,因此不会有任何线程间排序吗?

最佳答案

所有这些内置函数都对应于新的 C11 标准原子性特性。标准包含对 memory_order_relaxed 排序模型的完美解释和一些示例(引用 7.17.3/14)

// Thread 1:
r1 = atomic_load_explicit(&y, memory_order_relaxed);
atomic_store_explicit(&x, r1, memory_order_relaxed);

// Thread 2:
r2 = atomic_load_explicit(&x, memory_order_relaxed);
atomic_store_explicit(&y, 42, memory_order_relaxed);

此代码允许产生r1 == 42 && r2 == 42.因为线程 2 中的 y 存储可能会在加载 r2 之前重新排序。

关于multithreading - __ATOMIC_RELAXED 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32377201/

相关文章:

c# - 如何创建自定义 SynchronizationContext 以便所有延续都可以由我自己的单线程事件循环处理?

c# - System.Threading.Timer 在等待时是否消耗线程?

multithreading - 多核处理器上的多线程、并发和并行性

c - GCC 编译器执行 asm volatile ("nop"/::) 指令需要多长时间?

c++ - STL const_iterator 转换——编译器差异

c++ - 终止 worker

Java 线程挂起不起作用

c++ - 如果忽略返回值,如何发出警告?

c - 使用 gcc 理解共享库

c - 对静态库中符号的 undefined reference