Код: Выделить всё
void foo()
{
// Do some work that's fairly intensive
in_progress.store(false, /*???*/); // op 1
}
void bar()
{
if(in_progress.load(/*???*/)) // op 2
return
in_progress.store(true, /*???*/); // op 3
// calling thread is running an event loop
// t finishes whenever it's done
std::thread t(foo);
t.detach();
}
Моей первоначальной мыслью было то, что все три операции могут использовать std :: memory_order_relaxed < / code>, поскольку они не индексируют в массив или подготовку к памяти, мне нужна только атомичность, чтобы защитить от одновременных чтений / записи. Но потом я подумал, что это не правильно, так как построение самого объекта Thread - это «запись», которая должна иметь некоторый заказ памяти, окружающие его. Другими словами, конструкция t не может произойти до работы 3 в наблюдаемом порядке.
Моя проблема заключается в Или даже если в этом случае достаточно атомного флага. Если операция 3 произошла после построение t в программном порядке, то ответ будет ясен: уместна выпуск и приобретение семантики (подготовьте объект потока, то «опубликовать» результаты через магазин релизов). Тем не менее, я не могу перенести операцию 3 после строительства t , потому что тогда у меня на самом деле не будет профилактической охраны. Я действительно ищу порядок памяти, который предотвращает, записывает от переупорядочения до атомная запись, которая, кажется, похоже на то, что STD :: Memory_order_Release Гарантии. /п>
Подробнее здесь: https://stackoverflow.com/questions/794 ... omic-store