On most common platforms (the most important being x86; I understand that some platforms have extremely difficult memory models that provide almost no guarantees useful for multithreading, but I don't care about rare counter-examples), is the following code safe?
Thread 1:
someVariable = doStuff();
atomicSet(stuffDoneFlag, 1);
Thread 2:
while(!atomicRead(stuffDoneFlag)) {} // Wait for stuffDoneFlag to be set.
doMoreStuff(someVariable);
Assuming standard, reasonable implementations of atomic ops:
- Is Thread 1's assignment to
someVariable
guaranteed to complete beforeatomicSet()
is called? - Is Thread 2 guaranteed to see the assignment to
someVariable
before callingdoMoreStuff()
provided it readsstuffDoneFlag
atomically?
Edits:
- The implementation of atomic ops I'm using contains the x86
LOCK
instruction in each operation, if that helps. - Assume
stuffDoneFlag
is properly cleared somehow. How isn't important. - This is a very simplified example. I created it this way so that you wouldn't have to understand the whole context of the problem to answer it. I know it's not efficient.