Как заставить принудительно использовать переменные? - PullRequest
1 голос
/ 07 января 2020

Рассмотрим следующий код:

std::atomic<bool> flag(false);
//Thread 1
flag.store(true,std::memory_order_relaxed);
//Thread 2
while(!flag.load(std::memory_order_relaxed)) ; // stay in the loop
std::cout << "loaded";

Есть ли гарантия, что последняя строка будет выполнена? Если ответ «нет», как это следует исправить (с минимально возможными накладными расходами)?

1 Ответ

3 голосов
/ 07 января 2020

Да, последняя строка гарантированно будет выполнена в конечном итоге [intro.progress] / 18

Реализация должна гарантировать, что последнее значение (в порядке изменения) назначено с помощью атоми c или операция синхронизации станет видимой для всех других потоков за конечный период времени.

Поскольку ваш флаг - атоми c, и это также единственная вещь, к которой любой поток когда-либо обращается в любом случае, здесь нет гонок данных. Поскольку для начала нет никаких загрузок или хранилищ для объектов, отличных от вашего атома c, ваша программа не может зависеть от какого-либо конкретного порядка таких несуществующих нагрузок или хранилищ относительно нагрузок и хранилищ для вашего атома c. Таким образом, расслабленного порядка памяти вполне достаточно. Поскольку гарантируется, что хранилище atomi c в потоке 1 в конечном итоге станет видимым для потока 2, l oop гарантированно в конечном итоге завершится…

...