Asumsikan saya memulai std::thread
dan kemudian detach()
, jadi utas terus mengeksekusi meskipun std::thread
yang pernah mewakilinya, keluar dari ruang lingkup.
Asumsikan lebih lanjut bahwa program tidak memiliki protokol yang dapat diandalkan untuk bergabung dengan utas yang dilepaskan 1 , sehingga utas yang terlepas masih berjalan saat main()
keluar.
Saya tidak dapat menemukan apa pun dalam standar (lebih tepatnya, dalam N3797 C ++ 14 draft), yang menggambarkan apa yang harus terjadi, baik 1,10 maupun 30,3 berisi kata-kata yang bersangkutan.
1 Pertanyaan lain, yang mungkin setara, adalah: "dapatkah utas terpisah dilepas lagi", karena protokol apa pun yang ingin Anda gabungkan, bagian pensinyalan harus dilakukan saat utas masih berjalan, dan penjadwal OS mungkin memutuskan untuk meletakkan utas untuk tidur selama satu jam tepat setelah pensinyalan dilakukan dengan tidak ada cara bagi pihak penerima untuk secara andal mendeteksi bahwa utas benar-benar selesai.
Jika kehabisan main()
dengan menjalankan thread terpisah menjalankan perilaku tidak terdefinisi, maka setiap penggunaan std::thread::detach()
perilaku tidak terdefinisi kecuali utas utama tidak pernah keluar 2 .
Dengan demikian, kehabisan main()
dengan thread terpisah berjalan harus memiliki efek yang ditentukan . Pertanyaannya adalah: di mana (dalam standar C ++ , bukan POSIX, bukan OS docs, ...) adalah efek yang didefinisikan.
2 Utas yang terlepas tidak dapat bergabung (dalam arti std::thread::join()
). Anda bisa menunggu hasil dari utas terpisah (mis. Melalui masa depan dari std::packaged_task
, atau dengan menghitung semaphore atau bendera dan variabel kondisi), tetapi itu tidak menjamin bahwa utas telah selesai dieksekusi . Memang, kecuali Anda meletakkan bagian pensinyalan ke dalam destruktor dari objek otomatis utas pertama, akan ada , secara umum, menjadi kode (destruktor) yang dijalankan setelah kode pensinyalan. Jika OS menjadwalkan utas utama untuk mengonsumsi hasil dan keluar sebelum utas terpisah selesai menjalankan kata destructor, apa yang akan didefinisikan untuk terjadi?
std::exit
atau keluar darimain
cukup, tetapi tidak perlu, untuk memenuhi persyaratan ini." (seluruh paragraf mungkin relevan) Lihat juga [support.start.term] / 8 (std::exit
dipanggil saatmain
kembali)