【发布时间】:2015-09-04 13:53:30
【问题描述】:
假设在 C++11 程序中,我们有一个名为 A 的主线程,它启动一个名为 B 的异步线程。在线程 B 中,我们对具有std::memory_order_relaxed 内存顺序的原子变量执行原子存储。然后线程 A 与线程 B 连接。然后线程A 启动另一个名为C 的线程,该线程使用std::memory_order_relaxed 内存顺序执行原子加载操作。线程 C 加载的内容是否可能与线程 B 写入的内容不同?换句话说,这里宽松的内存一致性是否会延续到线程生命周期之后?
为了尝试这个,我编写了一个简单的程序并多次尝试运行它。该程序不会报告不匹配。我在想,因为线程 A 在启动线程时强加了一个顺序,所以不会发生不匹配。但是,我不确定。
#include <atomic>
#include <iostream>
#include <future>
int main() {
static const int nTests = 100000;
std::atomic<int> myAtomic( 0 );
auto storeFunc = [&]( int inNum ){
myAtomic.store( inNum, std::memory_order_relaxed );
};
auto loadFunc = [&]() {
return myAtomic.load( std::memory_order_relaxed );
};
for( int ttt = 1; ttt <= nTests; ++ttt ) {
auto writingThread = std::async( std::launch::async, storeFunc, ttt );
writingThread.get();
auto readingThread = std::async( std::launch::async, loadFunc );
auto readVal = readingThread.get();
if( readVal != ttt ) {
std::cout << "mismatch!\t" << ttt << "\t!=\t" << readVal << "\n";
return 1;
}
}
std::cout << "done.\n";
return 0;
}
【问题讨论】:
-
线程加入是一个同步点,它是一个完整的内存屏障。但是,我希望您注意通过测试来证明多线程世界中的任何内容:)
-
@SergeyA 这是一个非常好的观点!我会将其添加到我的答案中。
-
@SergeyA 这就是我在 SO 中问这个问题的原因。否则,我会继续我的简单测试:D 感谢您的帮助!
-
“测试显示错误的存在,而不是它们的缺失” :)
标签: c++ multithreading c++11 concurrency atomic