Итак, я знаю, что в С++ ничего не атома. Но я пытаюсь выяснить, есть ли какие-либо "псевдоатомные" предположения, которые я могу сделать. Причина в том, что я хочу избежать использования мьютексов в некоторых простых ситуациях, когда мне нужны только очень слабые гарантии.
1) Предположим, что у меня есть глобально определенный летучий bool b, который сначала я установил истину. Затем я запускаю поток, который выполняет цикл
while(b) doSomething();
Между тем, в другом потоке я выполняю b = true.
Можно ли предположить, что первый поток продолжит выполнение? Другими словами, если b начинается с истины, а первый поток проверяет значение b одновременно с тем, как второй поток назначает b = true, могу ли я предположить, что первый поток будет считать значение b истинным? Или возможно, что в некоторой промежуточной точке задания b = true значение b может считаться ложным?
2) Теперь предположим, что b изначально ложно. Затем первый поток выполняет
bool b1=b;
bool b2=b;
if(b1 && !b2) bad();
а второй поток выполняет b = true. Могу ли я предположить, что bad() никогда не вызван?
3) Что касается int или других встроенных типов: предположим, что у меня есть volatile int i, который изначально (скажем) 7, а затем присваиваю я = 7. Могу ли я предположить, что в любое время во время этой операции из любого потока значение я будет равно 7?
4) У меня есть volatile int я = 7, а затем я запускаю я ++ из некоторого потока, а все остальные потоки только читают значение i. Могу ли я предположить, что у меня никогда нет какой-либо ценности в любом потоке, кроме 7 или 8?
5) У меня есть volatile int i, из одного потока я выполняю я = 7, а из другого - я = 8. Впоследствии, я гарантированно должен быть 7 или 8 (или любые два значения, которые я выбрал для назначения)?