我试图了解数据竞赛和无日期竞赛之间的界限在哪里,以及未定义行为的后果是什么。
考虑这个例子:
#include <chrono>
#include <thread>
#include <cstdlib>
#include <iostream>
#include <ctime>
#include <functional>
void write(int delay, int& value, int target) {
std::this_thread::sleep_for(std::chrono::milliseconds(delay));
value = target;
}
int main() {
int x;
std::srand(std::time(nullptr));
auto t1 = std::thread(write, rand()%100, std::ref(x), 42);
auto t2 = std::thread(write, rand()%100, std::ref(x), 24);
t1.join();
t2.join();
std::cout << x;
}
这段代码是否总是有数据竞争,或者只是有时?根据标准,上述代码的行为是始终未定义,还是仅有时(取决于结果rand()
)?
PS:当然我不知道输出是否是42
or 24
,但是在存在未定义行为的情况下,我什至不会肯定地期望两者中的任何一个,它可能是123
or "your cat ate my fish"
。
PPS:我不关心高质量的随机性,因此rand()
对于这个例子来说很好。