【发布时间】:2014-04-13 13:21:21
【问题描述】:
我有一个程序可以生成多个线程,这些线程可能会将完全相同的值写入完全相同的内存位置:
std::vector<int> vec(32, 1); // Initialize vec with 32 times 1
std::vector<std::thread> threads;
for (int i = 0 ; i < 8 ; ++i) {
threads.emplace_back([&vec]() {
for (std::size_t j = 0 ; j < vec.size() ; ++j) {
vec[j] = 0;
}
});
}
for (auto& thrd: threads) {
thrd.join();
}
在这个简化的代码中,所有线程可能会尝试将完全相同的值写入vec 中的同一内存位置。这是一个可能触发未定义行为的数据竞争,还是因为在所有线程再次加入之前永远不会读取值而安全?
如果存在潜在危险的数据竞争,使用 std::vector<std::atomic<int>> 代替 std::memory_order_relaxed 存储是否足以防止数据竞争?
【问题讨论】:
-
实际上很容易确定某个东西是否是data-race-UB:如果可以同时执行多个写入但没有读取,那么您就有麻烦了。如果不止一次读取,但没有写入发生,那你很好。如果一次写入和至少一次读取同时发生,你又被搞砸了。简短:(>1 次写入)或(写入+读取)很麻烦。
-
使用原子,你是安全的。我认为没有理由在这里介绍 UB。
标签: c++ multithreading c++11 race-condition memory-model