Предоставляет ли порождение потока гарантии порядка памяти самостоятельно?

20

Я хочу сделать примерно это:

Начальная тема:

  • записать некоторые значения в глобальные переменные (они никогда не будут записаны снова)
    • Это могут быть данные среднего размера (массивы, строки и т. Д.). Не может быть просто сделано std::atomic<>.
  • порождают другие темы

Другие темы:

  • читать глобальное состояние
  • делать работу и т. д.

Теперь я знаю, что могу передавать аргументы std::thread, но я пытаюсь понять гарантии памяти C ++ в этом примере.

Кроме того, я вполне уверен, что в любой реальной реализации создание потока вызовет барьер памяти, гарантирующий, что поток может «видеть» все, что родительский поток написал до этого момента.

Но мой вопрос: это гарантировано стандартом?

В сторону: я полагаю, я мог бы добавить фиктив std::atomic<int>или около того, и написать в него, прежде чем запускать другие потоки, а затем в других потоках, прочитать это один раз при запуске. Я полагаю, что все механизмы до того гарантируют, что ранее написанное глобальное состояние будет правильно видимо.

Но мой вопрос: если что-то подобное требуется технически или достаточно создания потоков?

JWD
источник
Я полагаю, я мог бы добавить манекена std::atomic<int>... Вы можете использовать std::atomic_thread_fence.
Рин Каенбё
@NathanOliver d'oh. удаленный комментарий Я не могу сосчитать, как часто вы мне здесь помогали, какими бы глупыми ни были мои вопросы ...
idclev 463035818
1
@ idclev463035818 Не беспокойся. Это случается со всеми нами.
Натан Оливер

Ответы:

26

Создание темы достаточно. Существует точка синхронизации между конструктором потока и началом нового потока в соответствии с [thread.thread.constr] / 7

Синхронизация: завершение вызова конструктора синхронизируется с началом вызова копии f.

Это означает, что все состояние в потоке до появления нового потока является видимым для порожденного потока.

NathanOliver
источник