Нужен ли барьер памяти для доступа к памяти, измененной завершившимся потоком?

[Здесь и далее термины C ++]

У меня есть поток A и поток B, которые разделяют доступ к целочисленному значению P. Поток A инициализирует это значение и обновляет его во время работы. Затем поток А завершается. Поток B ожидает завершения потока A (стандартный вызов API OS, независимо от того, какая ОС используется) и хочет прочитать P.

Нужен ли потоку B барьер памяти для чтения согласованного, последнего установленного потоком A значения P? Существует ли вероятность того, что, когда API-интерфейс ОС скажет «поток завершен», изменения в измененной памяти еще не видны другим потокам?

Обратите внимание, что там только один поток записывает здесь значение, которое может отличать или не отличать этот вопрос от «Существует ли неявный барьер памяти с синхронизированными отношениями на thread :: join?«спросил раньше. Мое чувство кишки говорит мне, что ответ должен быть таким же, но …

2

Решение

join синхронизируется с потоком, который вызывает join, То есть все пишет что A Марки станут видны B когда B звонки A.join(),

Вы можете думать об этом как A проведение std::atomic_thread_fence(memory_order_release) как это заканчивается и B проведение std::atomic_thread_fence(std::memory_order_acquire как A присоединяется.

Нужен ли поток B барьеру памяти

Да, но они подразумеваются в join и вам не нужно их писать.

Существует ли вероятность того, что, когда API-интерфейс ОС скажет «поток завершен», изменения в измененной памяти еще не видны другим потокам?

Темы кроме звонящего join потребуется дополнительная синхронизация, например std::condition_variable или же std::atomic_thread_fence(std::memory_order_acquire);

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]