Rumah > Artikel > pembangunan bahagian belakang > Mengapa Niaga Hadapan Dikembalikan oleh std::async() Mempunyai Pemusnah Sekat?
Pemusnah Tersekat dalam Niaga Hadapan Asynchronous
Apabila masa depan dikembalikan daripada std::async, pemusnahnya menjadi menyekat secara tersirat, membawa kepada panggilan thread berhenti seketika. Walaupun tingkah laku ini mungkin kelihatan mengejutkan, ia bertujuan untuk keselamatan dan ketepatan.
Sebab Menyekat Pemusnah
Seperti yang dinyatakan oleh Hans Boehm dalam kertas putih "N3679: Async( ) pemusnah masa depan mesti menunggu," niaga hadapan yang dikembalikan oleh async() menunggu untuk keadaan kongsi yang berkaitan untuk menjadi sedia dalam mereka pemusnah. Ini menghalang senario di mana urutan yang berkaitan terus berjalan tanpa sebarang cara untuk menunggu siapnya setelah masa depan dimusnahkan. Tanpa langkah tambahan, benang "melarikan" sedemikian boleh melangkaui jangka hayat objek bergantungnya, yang berpotensi menyebabkan "hancuran ingatan" silang silang dan kelemahan keselamatan.
Contoh
Pertimbangkan coretan kod ini:
std::future<int> future = std::async(std::launch::async, run_async_task);
Jika pemusnah masa depan tidak menyekat, utas yang melaksanakan run_async_task boleh terus berjalan walaupun selepas masa depan dimusnahkan. Jika urutan ini mengakses mana-mana objek yang telah dimusnahkan, ralat masa jalan akan berlaku.
Pendekatan Alternatif
Untuk mengelakkan tingkah laku menyekat, panggil future.get() secara eksplisit atau future.wait() sebelum memusnahkan masa depan. Ini memastikan bahawa tugasan yang berkaitan telah selesai dan tidak lagi bergantung pada masa depan yang musnah.
Kemas kini
"Laporan Perjalanan" Michael Wong berikutan mesyuarat C Standard pada September 2013 memberikan perspektif terkini tentang topik ini. Walaupun terdapat perbincangan yang ketara, tiada perubahan pada tingkah laku menyekat std::destructors masa depan telah dibuat. Selain itu, cadangan untuk menghentikan penggunaan async akhirnya ditolak.
Atas ialah kandungan terperinci Mengapa Niaga Hadapan Dikembalikan oleh std::async() Mempunyai Pemusnah Sekat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!