Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Niaga Hadapan Dikembalikan oleh std::async() Mempunyai Pemusnah Sekat?

Mengapa Niaga Hadapan Dikembalikan oleh std::async() Mempunyai Pemusnah Sekat?

DDD
DDDasal
2024-11-20 15:43:12991semak imbas

Why do Futures Returned by std::async() Have Blocking Destructors?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn