Я хочу сделать примерно это:
Начальная тема:
- записать некоторые значения в глобальные переменные (они никогда не будут записаны снова)
- Это могут быть данные среднего размера (массивы, строки и т. Д.). Не может быть просто сделано
std::atomic<>
.
- Это могут быть данные среднего размера (массивы, строки и т. Д.). Не может быть просто сделано
- порождают другие темы
Другие темы:
- читать глобальное состояние
- делать работу и т. д.
Теперь я знаю, что могу передавать аргументы std::thread
, но я пытаюсь понять гарантии памяти C ++ в этом примере.
Кроме того, я вполне уверен, что в любой реальной реализации создание потока вызовет барьер памяти, гарантирующий, что поток может «видеть» все, что родительский поток написал до этого момента.
Но мой вопрос: это гарантировано стандартом?
В сторону: я полагаю, я мог бы добавить фиктив std::atomic<int>
или около того, и написать в него, прежде чем запускать другие потоки, а затем в других потоках, прочитать это один раз при запуске. Я полагаю, что все механизмы до того гарантируют, что ранее написанное глобальное состояние будет правильно видимо.
Но мой вопрос: если что-то подобное требуется технически или достаточно создания потоков?
std::atomic<int>
... Вы можете использоватьstd::atomic_thread_fence
.Ответы:
Создание темы достаточно. Существует точка синхронизации между конструктором потока и началом нового потока в соответствии с [thread.thread.constr] / 7
Это означает, что все состояние в потоке до появления нового потока является видимым для порожденного потока.
источник