стандартная атомарная синхронизация и неатомарная переменная: не устаревшие данные? - PullRequest
0 голосов
/ 09 января 2019

Я знаю, что этот код правильный (кроме delete не выполнено):

#include <thread>
#include <atomic>
#include <cassert>
#include <string>

std::atomic<std::string*> ptr;
int data;

void producer()
{
    std::string* p  = new std::string("Hello");
    data = 42;
    ptr.store(p, std::memory_order_release);
}

void consumer()
{
    std::string* p2;
    while (!(p2 = ptr.load(std::memory_order_acquire)))
        ;
    assert(*p2 == "Hello"); // never fires
    assert(data == 42); // never fires
}

int main()
{
    std::thread t1(producer);
    std::thread t2(consumer);
    t1.join(); t2.join();
}

Однако мне интересно, почему в потребительском потоке данных не может быть устаревших данных . Это из-за операции acquire?

1 Ответ

0 голосов
/ 09 января 2019

Назначение на data происходит до ptr.store вызова. Доступ к data происходит после этого вызова (да, посредством синхронизации с атомарным объектом). Таким образом, доступ гарантированно увидеть значение, назначенное ранее.

...