Вопрос, который вы должны задать: «это - атомный»? Вот и все, что здесь имеет значение. Вы хотите что-то сделать, когда флаг достигнет 0.
Вам плевать на этот сценарий:
1. Main thread reads flag, and it is 1.
2. Worker changes flag with --
3. Main thread doesn't see that flag is actually 0.
Поскольку через 1 нс основной поток зацикливается и пытается снова.
Вас волнует, что это не атомарное и два потока, изменяющие его одновременно, пропустят уменьшение:
1. Thread A reads flag, flag is 2
2. Thread B reads flag, flag is 2
3. Thread A decrements its copy of flag, 2, and writes to flag, flag is 1
4. Thread B decrements its copy of flag, also 2, and writes to flag, flag is 1.
Вы потеряли декремент. вы хотите использовать __ sync_fetch_and_sub (& flag, 1), который будет атомарно уменьшать флаг.
Наконец, вращение вокруг сна - не лучший способ сделать это. Вы хотите либо подождать при условии, либо подождать сигнал . Пусть рабочие потоки повышают условие или сигнал, когда они понимают, что у них уменьшен флаг до 0.