C ++ atomi c операция CAS (сравнение и замена) не меняет значение - PullRequest
1 голос
/ 12 июля 2020

Что на самом деле происходит в следующем примере? Почему значение не меняется после успешного обмена?

Live: https://wandbox.org/permlink/f5VYSKfQ9UJqa8FQ

std::atomic<bool> flag{false};

int main()
{
    std::thread thread([](){
        while(true){        
            // wait until flag not becomes true
            {
              bool expect = true;
              while(!flag.compare_exchange_strong(expect, false, std::memory_order_acq_rel)){
                  std::cout << "wait" << std::endl;
              }
            }
            
            std::cout << "work" << std::endl;
        }
    });
    flag.store(true, std::memory_order_release);
    thread.join();
}

Вывод:

work
wait
work
wait
...

1 Ответ

1 голос
/ 13 июля 2020

Рассмотрим, что происходит с:

          bool expect = true;
          while(!flag.compare_exchange_strong(expect, false, std::memory_order_acq_rel)){
              std::cout << "wait" << std::endl;
          }

, когда флаг ложный. При первом запуске теста за время l oop expect будет истинным, поэтому не соответствует флагу. Итак, expect обновляется до false, и функция возвращает false. Итак, печатается wait, а l oop повторяется. Второй тест в l oop, expect теперь будет ложным, что соответствует flag, поэтому для flag будет установлено значение false (oop как оно есть), а l oop

Эффект net будет всегда устанавливать flag на false и печатать wait, если это уже было false. Таким образом, вы видите результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...