На большинстве распространенных платформ (наиболее важными из которых являются x86; я понимаю, что на некоторых платформах очень сложные модели памяти, которые почти не дают гарантий, полезных для многопоточности, но мне не нужны редкие контрпримеры), следующий код безопасно?
Тема 1:
someVariable = doStuff();
atomicSet(stuffDoneFlag, 1);
Тема 2:
while(!atomicRead(stuffDoneFlag)) {} // Wait for stuffDoneFlag to be set.
doMoreStuff(someVariable);
Принимая стандартные, разумные реализации атомарных операций:
- Гарантируется ли выполнение потока 1 для
someVariable
до вызова atomicSet()
?
- Гарантируется ли в потоке 2 присваивание
someVariable
перед вызовом doMoreStuff()
при условии, что он читает stuffDoneFlag
атомарно?
Правки:
- Используемая мной реализация атомарных операций содержит инструкцию x86
LOCK
в каждом
операция, если это поможет.
- Предположим,
stuffDoneFlag
как-то правильно очищено. Как не важно.
- Это очень упрощенный пример. Я создал это таким образом, чтобы вам не пришлось понимать весь контекст проблемы, чтобы ответить на него. Я знаю, что это не эффективно.