Чи нерестовинна нитка забезпечує гарантії порядку пам’яті самостійно?


20

Я хочу зробити приблизно це:

Початкова нитка:

  • запишіть деякі значення у глобальну вару (вони більше ніколи не будуть записані)
    • Це можуть бути помірно великі дані (масиви, рядки тощо). Неможливо просто зробити std::atomic<>.
  • нерест інших ниток

Інші теми:

  • читати глобальну державу
  • робити роботу тощо.

Тепер я знаю, що можу передати аргументи std::thread, але я намагаюся зрозуміти гарантії пам'яті C ++ на цьому прикладі.

Крім того, я впевнений, що в будь-якій реальній реалізації створення потоку спричинить бар'єр пам’яті, що гарантує, що потік може «бачити» все, що написав батьківський потік до цього моменту.

Але моє запитання: чи це гарантується стандартом?

Убік: я вважаю, що я міг би додати якийсь манекен std::atomic<int>чи так, і написати до цього, перш ніж запустити інші потоки, а потім на інші теми, прочитайте це один раз під час запуску. Я вважаю, що все, що трапляється раніше, тоді гарантувало б, що раніше написана глобальна держава була належним чином видна.

Але моє запитання, чи потрібно щось подібне технічно, чи достатньо створення ниток?


Я гадаю, я міг би додати трохи манекена std::atomic<int>... Можна використовувати std::atomic_thread_fence.
Рін Каенб’ю

@NathanOliver d'oh. видалений коментар. Я не можу порахувати, як часто ти мені тут допомагав, якими б дурними не були мої запитання ...
idclev 463035818

1
@ idclev463035818 Не хвилюйтесь. Це трапляється з усіма нами.
NathanOliver

Відповіді:


26

Створення ниток достатньо. Існує точка синхронізації між конструктором потоку та початком нового потоку на [thread.thread.constr] / 7

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

Це означає, що всі стану в потоці до появи спалаху нового потоку видно для породженої нитки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.