问题
static std::atomic<double> dataX =0.0;
dataX
以及负责从dataX
读取的其他函数,然后将其发布到容器中。dataX
的读/写操作都会在非常少的CPU周期内被调用。 C / C ++运行时如何为std::atomic<double>
表现出这样的条件?
我们是否可以保证std::atomic<double> dataX
的写入和读取值都保持这样的条件?
答案 0 :(得分:1)
这取决于。 当您使用正确的获取释放语义执行原子操作时,或者如果它们是顺序一致的,那么在原子变量上读取的任何线程都可以看到(包括)此原子写操作之前的每次写入。
不保证的是,您的读者线程会看到原子上的每一个变化。在读者线程有机会读出它之前,编写器线程很可能多次写入原子。
一般来说,你想要完成的事情听起来很可疑。您应该考虑使用常用且经过良好测试的标准同步对象之一,例如std::condition_variable
。
答案 1 :(得分:0)
编写原子意味着您的线程必须拥有数据所在的缓存行的唯一所有权。因此CPU(假设和intel / amd)发出写入请求,并且必须等待计算机的所有可能部分释放所有副本。
这可能非常慢,因为高速缓存行当前可能驻留在外围设备(如图形卡)中。在这种情况下,只有你的编写器和读者只有两个进程,这使得它更有可能在缓存中的某个地方,因此每1ms只需要延迟~12~150个周期。