Синхронизация после окончания потока - PullRequest
1 голос
/ 25 февраля 2011

Поскольку часть этого вопроса не была рассмотрена, я делаю его отдельным вопросом:

#include<iostream>
#include<thread>
using namespace std;

void f2(double* ret) {
   *ret=5.;
}

int main() {
   double ret=0.;
   thread t2(f2, &ret);
   t2.join();
   cout << "ret=" << ret << endl;   
}

Свободна ли эта гонка данных программы?
Существуют ли какие-либо гарантии в отношении новой модели памяти C ++, что доступ к переменной ret из потока t2 и потока main синхронизирован?

Я имею в виду, очевидно, что доступы из t2 и main не будут конфликтовать, если программа выполняется на том же ядре.
Но что, если t2 и main выполняются на разных ядрах?
Есть ли гарантии, что кеши ядра синхронизируются до того, как main продолжит выполнение?

Буду признателен, если кто-нибудь предоставит такие же ссылки.

Спасибо.

1 Ответ

5 голосов
/ 25 февраля 2011

Ваша программа свободна от гонки данных. [thread.thread.member] / p5 описывает join () с Synchronization абзацем:

Синхронизация: завершение потока, представленного *, это синхронизирует с (1.10) соответствующее успешное возвращение join (). [Примечание: операции * не синхронизированы. -endnote]

(1.10) относится к [intro.multithread], который является слишком длинным для цитирования разделом, но в мельчайших деталях определяет фразу «синхронизируется с».

Последний рабочий проект: N3225 .

...