Код: Выделить всё
if (ready.load(std::memory_order_acquire) ||
ready.exchange(true, std::memory_order_acq_rel))
{ ... }
Для меня выглядит так, что мы могли бы использовать просто обмен :
if (ready.exchange(true, std::memory_order_acq_rel))
{ ... }
Мой вопрос: Почему также загружать как в первом примере? Мне не ясно, если это сделано для правильности или эффективности. Первый поток вызывает API C, взяв обратный вызов C, а затем необходимо выполнить некоторую работу, выполняя необязательную, называемую переменную stopcallback .
, как правило, первое поток будет загружать ready varible, см. False , а затем перейдите к установке, чтобы установить ее в True через Exchange , см. В том, что он все еще был false , а не выполнять, если blob. Обратный вызов C может быть вызван из второго потока, который будет загружать The Ready и увидеть значение True и выполнить блок if (завершение API C).
Насколько я могу увидеть, чтобы сделать просто обмен , но оба потока будут выполнять обмен . С опцией загрузка , за которым следует Exchange : обычно будет нагрузка и Exchange из одного потока и только нагрузку от другого (хотя это может быть так, что оба потока для загрузки и Exchange ).
Подробнее здесь: https://stackoverflow.com/questions/797 ... atomicbool