std::原子内存屏障可以用来在线程之间传输非原子数据吗?
Can std::atomic memory barriers be used to transfer non-atomic data between threads?
以下代码标准是否兼容?(或者它可以在不使原子或volatile
的情况下x
兼容吗?
这类似于之前的问题,但是我想引用C++标准的相关部分。
我担心的是原子store()
和load()
没有为非原子变量(x
在下面的示例中(提供足够的编译器屏障来正确释放和获取语义。
我的目标是实现无锁原语,例如队列,它可以在线程之间传输指向常规C++数据结构的指针。
#include <atomic>
#include <chrono>
#include <iostream>
#include <thread>
int x; // regular variable, could be a complex data structure
std::atomic<int> flag { 0 };
void writer_thread() {
x = 42;
// release value x to reader thread
flag.store(1, std::memory_order_release);
}
bool poll() {
return (flag.load(std::memory_order_acquire) == 1);
}
int main() {
x = 0;
std::thread t(writer_thread);
// "reader thread" ...
// sleep-wait is just for the test.
// production code calls poll() at specific points
while (!poll())
std::this_thread::sleep_for(std::chrono::milliseconds(50));
std::cout << x << std::endl;
t.join();
}
通过获取/释放,是的,这就足够了。相关报价(来自 cpp偏好 - 在大多数情况下与标准一样好(:
内存模型
当表达式的计算写入内存位置,而另一个计算读取或修改相同的内存位置时,表达式被称为冲突。具有两个冲突评估的程序具有数据争用,除非
两个相互冲突的计算都是原子操作(见std::atomic
(- 其中一个相互冲突的评估发生在另一个之前(见
std::memory_order
(标准::memory_order
发布-获取排序
如果线程 A 中的原子存储被标记为
memory_order_release
并且线程 B 中来自同一变量的原子负载被标记为memory_order_acquire
,则从线程 A 的角度来看,在原子存储之前发生的所有内存写入(非原子和松散原子(都会成为线程 B 中的可见副作用,也就是说,一旦原子加载完成, 线程 B 保证看到线程 A 写入内存的所有内容。
相关文章:
- 在 docker 容器之间传输时缺少 stdlib 符号
- 读取USB与操作系统、C++之间传输的数据
- 如何在两组线程之间正确来回传输控制权
- 使用 python 胶囊在 cython 和 pybind11 之间传输 c++ 对象
- TCP在客户端服务器之间传输时,数据是否有任何限制
- 在计算机之间使用C 传输文件
- 如何封装两个容器之间的传输字节
- 在C 中,是否有可能在不兼容类型的std ::向量对象之间传输不同类型的缓冲区
- 通过TCP在客户端/ C#服务器之间传输文件C++
- C++函数之间传输字符串
- 无法使用<double> QTcpSocket 和 QDataStream 在服务器和客户端之间传输 QVector
- 如何在"mwArray *"和"mxArray *"之间传输数据?
- 为什么文件没有通过 tcp 在 C# 中的客户端和 C 中的服务器之间正确传输(保存?)
- 如何在C 中连接两个对象以在它们之间传输数据
- 是否可以在GDB会话之间传输对程序的控制
- 为什么我的数据无法在信号/插槽的表格之间传输
- C++在32位应用程序之间传输大量数据以进行视频播放的方法
- 实时在语言之间流水线传输或以其他方式传输数据
- 在 2 个程序 (Windows) 之间传输信息
- 在两个套接字c++之间传输整数值