Apakah menelurkan utas memberikan jaminan pesanan memori sendiri?

20

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<>.
  • 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?

jwd
sumber
Saya kira saya bisa menambahkan beberapa boneka std::atomic<int>... Anda dapat menggunakan std::atomic_thread_fence.
Rin Kaenbyou
@NathanOliver d'oh. komentar yang dihapus. Saya tidak dapat menghitung seberapa sering Anda membantu saya di sini, tidak peduli betapa bodohnya pertanyaan saya ...
idclev 463035818
1
@ idclev463035818 Jangan khawatir. Ini terjadi pada kita semua.
NathanOliver

Jawaban:

26

Pembuatan utas sudah cukup. Ada titik sinkronisasi antara konstruktor utas dan awal utas baru per [utas.thread.constr] / 7

Sinkronisasi: Penyelesaian doa dari konstruktor disinkronkan dengan awal doa salinan f.

Ini berarti bahwa semua status di utas sebelum utas baru muncul terlihat oleh utas yang dihasilkan.

NathanOliver
sumber