Барьеры и точки синхронизации с неатомарными переменными - гонка данных? - PullRequest
0 голосов
/ 20 ноября 2018

Рассмотрим следующую программу:

int                        i{0};
std::experimental::barrier b{2};

int main()
{
    std::thread t0{[] {
        b.arrive_and_wait();
        std::cout << i << '\n';
    }};

    std::thread t1{[] {
        i = 2;
        b.arrive_and_wait();
    }};

    t0.join();
    t1.join();
}

Гарантируется ли в этой программе вывод 2, даже если i не является атомарной переменной?

Согласно cppreference :

Вызов arrive_and_wait синхронизируется с началом фазы завершения барьера.Завершение фазы завершения синхронизируется с возвратом из вызова.

Вызовы arrive_and_drop и arrive_and_wait никогда не вводят гонки данных между собой или друг с другом.

Это предполагаетчто на каждом arrive_and_wait вызове есть точка синхронизации.Однако я не уверен, разрешено ли компилятору переупорядочивать операции чтения / записи для i, поскольку он не является атомарным.

1 Ответ

0 голосов
/ 20 ноября 2018

Из того, что я понимаю из std :: барьер, ссылка (мой акцент):

Барьер имеет фазу завершения, которая выполняется одним из участвующих потоков один развсе потоки в наборе участвующих потоков поступают в точку синхронизации.Вызовы receive_and_wait и Arrive_and_drop синхронизируются с началом фазы завершения;t Конец фазы завершения синхронизируется с возвратами всех вызовов, заблокированных его завершением. .

. Можно предположить, что все изменения, сделанные до того, как барьер в разных потоках, видны в другихтемы, даже если они не атомарные.Как указывает эта ссылка (мой акцент):

Между потоками оценка A выполняется между потоками перед оценкой B, если выполняется любое из следующих условий

1) A синхронизируется с B

2) A упорядочивается по зависимостям до B

3) A синхронизируется с некоторой оценкой X, а X упорядочивается доB

4) A секвенируется - перед некоторой оценкой X, и X между потоками происходит - до B

5) Inter-ниточка происходит - до некоторой оценки X, и X inter- threadнить происходит - до B

...