Saya ingin melakukan kira-kira ini:
Utas awal:
- tulis beberapa nilai ke global vars (mereka tidak akan pernah ditulis lagi)
- Ini bisa berupa data yang cukup besar (array, string, dll). Tidak bisa dibuat begitu saja
std::atomic<>
.
- Ini bisa berupa data yang cukup besar (array, string, dll). Tidak bisa dibuat begitu saja
- menelurkan utas lainnya
Utas lainnya:
- baca keadaan global
- lakukan pekerjaan, dll.
Sekarang, saya tahu saya bisa meneruskan argumen std::thread
, tapi saya mencoba memahami jaminan memori C ++ melalui contoh ini.
Juga, saya cukup yakin bahwa pada implementasi dunia nyata apa pun, membuat utas akan menyebabkan penghalang memori memastikan bahwa utas dapat "melihat" semua yang ditulis oleh induknya sampai saat itu.
Tetapi pertanyaan saya adalah: apakah ini dijamin oleh standar?
Selain itu: Saya kira saya bisa menambahkan beberapa boneka std::atomic<int>
atau lebih, dan menulis itu sebelum memulai utas lainnya, lalu pada utas lainnya, baca sekali pada saat startup. Saya percaya semua yang terjadi sebelum mesin akan menjamin bahwa negara global yang ditulis sebelumnya terlihat dengan baik.
Tetapi pertanyaan saya adalah apakah hal seperti itu secara teknis diperlukan, atau apakah pembuatan utas cukup?
sumber
std::atomic<int>
... Anda dapat menggunakanstd::atomic_thread_fence
.Jawaban:
Pembuatan utas sudah cukup. Ada titik sinkronisasi antara konstruktor utas dan awal utas baru per [utas.thread.constr] / 7
Ini berarti bahwa semua status di utas sebelum utas baru muncul terlihat oleh utas yang dihasilkan.
sumber