====== 2014-08-13 - race condition and data race ======
today i had a nice conversation with a friend regarding multithreading. we were figuring out what is the relation between a [[wp>race condtion]] and a [[wp>race condition#C.2B.2B|data race]].
first question was: is it possible to have race condition without having a data race? the answer is yes. example proving it:
// thread 1:
cout << 1;
// thread 2:
cout << 2;
program is a classic race condition, as the output is either "12" or "21". using //cout// from different threads is not a data race (though content of both writes may obviously interleave).
so the second question is: is a data race concept a subset of a race condition concept? or another way around: is it possible to have a data race without having a race condition? again the answer is yes! proof:
// global variable:
int x;
// thread 1:
x = 1;
// thread 2:
x = 1
// main:
joinThread1();
joinThread2();
cout << x;
there is a clear data race on "x", but there is no race condition, as the output will always be "1". of course it is a bit tricky here -- program with data race has an undefined behavior, so we cannot be really certain of anything. in practice however, on modern desktop, this particular case works just fine.
a conclusion is that data race and race conditions are independent concepts. you can have either one, (at least theoretically) without having an other.