频繁更新 std::atomic<double> 数据有问题吗?

Is frequently updating std::atomic<double> data problematic?

本文关键字:gt 数据 double 有问题 lt 更新 std atomic      更新时间:2023-10-16

问题

  • 假设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个周期的延迟。