经常更新std :: atomic <double>数据有问题吗?

时间:2017-10-30 05:48:50

标签: c++ multithreading c++11 atomic stdatomic

问题

  • 假设在cpp(模块)
  • 中定义static std::atomic<double> dataX =0.0;
  • 模块中,定义了两个单独的函数。
  • 这些函数将由两个线程独立调用和运行,在引擎盖下(在函数内)定义了两个连续的循环过程;直到
    调用一些break语句(使用谓词)。
  • 当两个函数运行时,一个函数负责将数据写入dataX以及负责从dataX读取的其他函数,然后将其发布到容器中。
  • 这两个函数的执行发生在所描述的两个线程下,并且每个线程在非常微小的毫秒( 1ms )的持续时间内进入休眠状态。
  • 因此dataX的读/写操作都会在非常少的CPU周期内被调用。

C / C ++运行时如何为std::atomic<double>表现出这样的条件?

我们是否可以保证std::atomic<double> dataX的写入和读取值都保持这样的条件?

2 个答案:

答案 0 :(得分:1)

这取决于。 当您使用正确的获取释放语义执行原子操作时,或者如果它们是顺序一致的,那么在原子变量上读取的任何线程都可以看到(包括)此原子写操作之前的每次写入。

不保证的是,您的读者线程会看到原子上的每一个变化。在读者线程有机会读出它之前,编写器线程很可能多次写入原子。

一般来说,你想要完成的事情听起来很可疑。您应该考虑使用常用且经过良好测试的标准同步对象之一,例如std::condition_variable

答案 1 :(得分:0)

编写原子意味着您的线程必须拥有数据所在的缓存行的唯一所有权。因此CPU(假设和intel / amd)发出写入请求,并且必须等待计算机的所有可能部分释放所有副本。

这可能非常慢,因为高速缓存行当前可能驻留在外围设备(如图形卡)中。在这种情况下,只有你的编写器和读者只有两个进程,这使得它更有可能在缓存中的某个地方,因此每1ms只需要延迟~12~150个周期。