Код: Выделить всё
// somewhere member var 'executing' is defined as std::atomic`
int A::something(){
int result = 0;
// my intention is only one thread should enter next block
// others should just return 0
if(!executing){
executing = true;
...
// do some really long processing
...
result = processed;
executing = false;
}
return result;
}
< /code>
Я прочитал эту страницу о CPPReerference, в которой упоминается -< /p>
Каждое экземпляр и полная специализация шаблона Atd :: Atomic определяет атомный тип. Если один поток записывает в атомный объект, в то время как другой поток считывает из него, поведение хорошо определена (см. Модель памяти для получения подробной информации о расах данных) < /p>
< /blockquote>
и на модели памяти. Говорят, что выражения конфликтуют. Программа, у которой есть две противоречивые оценки, имеет расу данных, если ни один < /p>
Обе противоречивые оценки не являются атомными операциями (см. STD :: Atomic) < /p>
< /li>
Одна из конфликтов) < />
< /pmord hord_ dord_ dord_ dord_ dord_ dord_ dord_ dord_ dord_ dord_ dord_ dord wemord wem dom hom /> < /li>
< /ul>
Если происходит раса данных, поведение программы не определен. Другая ветка. См. Std :: Memory_order для получения подробной информации о порядке, в котором записи, сделанные из потоков, становятся видимыми в другие потоки. И что более важно - гарантировано ли, что ни один другой поток не введет, что если цикл, если один два потока введет это, если тело, так как первое установит выполнение Подробнее здесь: https://stackoverflow.com/questions/398 ... code-block