4 ms·
the order you supply here can not happen (at least if i understand what you are saying) if step #9 happens then #10 will be skipped by the "if (state->g2 == SP
by keithgabryelski 12y ago
the order you supply here can not happen (at least if i understand what you are saying)
if step #9 happens then #10 will be skipped by the
"if (state->g2 == SPIN_LOCK_NO_LOCKER) {"
what am i missing?
- wzdd 12y agoThread A sets g1 to A (line 31), thread A enters the "if" statement (line 32), thread A reads the value of g1 and is about to write that value to g2 but gets pre-empted (half of line 33). Thread B sets g1 to B (line 31), thread B enters the "if" statement (because A hasn't yet written g1 to g2, line 32), thread B reads the value of g1 (half of line 33) and writes that value to g2 (the other half), then does its tests and returns OK. Thread A sets g2 to A (the other half of line 33). Thread A does its tests and notices that g1 != g2. Thread A returns to the top of the loop and notices that g2 == A (line 22). Thread A returns OK. This is assuming that reads are strongly ordered between processes and cores, and that code executes in-order, none of which is true.
- colanderman 12y agoI misread the algorithm, sorry. On second read, it appears to check out (modulo memory barriers!) up to the retry-on-fail, which, as Jacques Mattheij points out elsewhere, leads to a failure in mutual exclusion. I've updated my reply to reflect this failure mode.