Apakah yang Berlaku Apabila Benang Tertanggal Hidup Lebih Lama Main()?
Dalam C , benang boleh ditanggalkan menggunakan detach(), membenarkannya berjalan secara bebas daripada objek std::thread yang pada mulanya menciptanya. Walau bagaimanapun, gelagat standard untuk utas tertanggal apabila keluar main() kekal samar-samar.
Senyap Standard dan Kesan Tersirat
Baik bahagian 1.10 mahupun 30.3 draf C 14 tidak secara eksplisit mentakrifkan nasib benang tertanggal apabila main() keluar. Kekaburan ini membawa kepada beberapa soalan:
Ketiadaan garis panduan yang jelas menunjukkan bahawa kehabisan main() dengan benang tertanggal mesti mempunyai kesan yang ditentukan, kerana menghentikan benang tertanggal pada asasnya akan menjadikan detach() tidak bermakna.
Had Tersirat
Sementara standard tidak menyatakan secara eksplisit apa yang berlaku kepada benang yang terpisah, ia menyediakan beberapa kekangan:
Menyertai Benang Terpisah
Persoalan sama ada benang tertanggal boleh dicantumkan juga dijawab dalam jawapan. Jawapannya mendedahkan bahawa utas yang terpisah sememangnya boleh disambungkan menggunakan keluarga fungsi *_at_thread_exit (notify_all_at_thread_exit(), std::promise::set_value_at_thread_exit(), dll.).
Mitigating Undefined Behatin >
Kepada elakkan gelagat yang tidak ditentukan apabila main() keluar dengan urutan tertanggal berjalan, pertimbangkan strategi berikut:
Kesimpulan
Walaupun piawaian C tidak mentakrifkan secara eksplisit tingkah laku benang tertanggal apabila main() keluar, ia memberikan had dan implikasi yang mencadangkan kesan yang ditakrifkan. Dengan mematuhi pengehadan ini dan menggunakan keluarga fungsi *_at_thread_exit, pengaturcara boleh mengendalikan benang yang terpisah dan mengelakkan tingkah laku yang tidak ditentukan.
Atas ialah kandungan terperinci Apa yang Berlaku kepada Benang Terpisah Apabila Fungsi `utama()` Keluar dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!