频繁更新 std::atomic<double> 数据有问题吗?
Is frequently updating std::atomic<double> data problematic?
问题
- 假设
static std::atomic<double> dataX =0.0;
在cpp(模块)中定义 - 在模块中,定义了两个独立的函数
- 这些函数将由两个线程独立调用和运行,在函数内部定义了两个连续的循环过程;直到
调用某个break语句(使用谓词) - 当这两个函数运行时,一个函数负责向
dataX
写入数据,另一个函数则负责从dataX
读取数据,然后将其发布到容器中 - 如前所述,这两个函数的执行发生在两个线程下,每个线程都会在非常小的毫秒(1ms)内休眠
- 因此,
dataX
的读/写操作都是耦合的,并且在非常短的CPU周期时间内被调用
对于std::atomic<double>
,C/C++运行时如何表现这种条件
我们能保证std::atomic<double> dataX
的写入值和读取值都保持这种状态吗
这取决于情况。当您使用正确的获取发布语义执行原子操作时,或者如果它们顺序一致,则在该原子写入操作之前(包括之前)的每一次写入都将对读取该原子变量的任何线程可见。
不能保证的是,您的阅读器线程会看到原子上的每一个变化。在读取器线程有机会读取原子之前,编写器线程可能多次向原子写入。
总的来说,你试图完成的事情听起来很可疑。您应该考虑使用一个常见且经过良好测试的标准同步对象,如std::condition_variable
。
编写原子意味着您的线程必须拥有数据所在缓存线的唯一所有权。因此,CPU(假设和intel/amd)发出写入请求,必须等待计算机的所有可能部分释放所有副本。
这可能非常慢,因为缓存线目前可能位于图形卡等外围设备中。在这种情况下,只有写入程序和读取器是两个进程,这使得它更有可能位于缓存中的某个位置,因此每1ms只需要大约12-150个周期的延迟。
相关文章:
- 防止主数据类型C++的隐式转换
- 用于访问容器<T>数据成员的正确 API
- 嵌套在类中时无法设置成员数据
- 使用流处理接收到的数据
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在cuda线程之间共享大量常量数据
- C++将文本文件中的数据读取到结构数组中
- 如何在C++中序列化结构数据
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 在c代码之间共享数据的最佳方式
- 链表,反向函数,数据结构
- 数据成员SFINAE的C++17测试:gcc vs clang
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 如何对点云数据进行排序
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 在运行时处理类型擦除的数据-如何不重新发明轮子