Предотвращение переупорядочения записей перед атомным магазиномC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Предотвращение переупорядочения записей перед атомным магазином

Сообщение Anonymous »

У меня есть следующая ситуация: я хочу начать несколько длинную асинхронную нить в ответ на какое -то событие, но хочу запустить только одну ветку за раз перед лицом нескольких событий. По сути, у меня есть следующее : < /p>

Код: Выделить всё

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();
}
Теперь, очевидно, in_progress должен быть синхронизирован, но мой вопрос заключается в том, какой заказ памяти, если таковые имеются, следует использовать в этих операциях?
Моей первоначальной мыслью было то, что все три операции могут использовать std :: memory_order_relaxed < / code>, поскольку они не индексируют в массив или подготовку к памяти, мне нужна только атомичность, чтобы защитить от одновременных чтений / записи. Но потом я подумал, что это не правильно, так как построение самого объекта Thread - это «запись», которая должна иметь некоторый заказ памяти, окружающие его. Другими словами, конструкция t не может произойти до работы 3 в наблюдаемом порядке.
Моя проблема заключается в Или даже если в этом случае достаточно атомного флага. Если операция 3 произошла после построение t в программном порядке, то ответ будет ясен: уместна выпуск и приобретение семантики (подготовьте объект потока, то «опубликовать» результаты через магазин релизов). Тем не менее, я не могу перенести операцию 3 после строительства t , потому что тогда у меня на самом деле не будет профилактической охраны. Я действительно ищу порядок памяти, который предотвращает, записывает от переупорядочения до атомная запись, которая, кажется, похоже на то, что STD :: Memory_order_Release Гарантии. /п>

Подробнее здесь: https://stackoverflow.com/questions/794 ... omic-store
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»