Menyekat Sifat std::future Destructor Dikembalikan oleh std::async
Semasa berhasrat untuk melancarkan tugasan secara tidak segerak, didapati bahawa pemusnah std::future dikembalikan oleh std::async mempamerkan tingkah laku menyekat. Ini menimbulkan persoalan tentang rasional di sebalik keputusan reka bentuk ini dan sama ada ia boleh dipertingkatkan untuk kemudahan dan kecekapan.
Argumen untuk Menyekat Pemusnah
Salah satu kebimbangan utama yang ditangani oleh pemusnah menyekat menghalang benang "melarikan diri". Jika std::future dimusnahkan tanpa menunggu urutan yang berkaitan selesai, ia boleh membawa kepada tingkah laku yang tidak dapat diramalkan dan potensi kerosakan ingatan.
Seperti yang diterangkan dalam kertas Hans Boehm (N3679), isu ini boleh timbul apabila thread beroperasi pada data yang telah dimusnahkan. Tanpa pemusnah yang menyekat, utas itu berpotensi untuk terus mengakses dan mengubah suai data tersebut, yang membawa kepada isu memori silang benang.
Pendekatan Alternatif
Sesetengah telah mencadangkan agar pemusnah tidak menyekat adalah mencukupi jika kaedah dapatkan atau tunggu sentiasa dipanggil untuk mendapatkan keputusan atau menunggu untuk selesai. Walau bagaimanapun, Boehm berhujah bahawa bergantung pada panggilan eksplisit terdedah kepada pengawasan dan boleh membawa kepada kelemahan keselamatan. Keadaan luar biasa, seperti pengecualian semasa pelaksanaan, boleh memintas panggilan sedemikian dan mengakibatkan penciptaan benang lari.
Status Semasa dan Perkembangan Masa Depan
Walaupun perbincangan berterusan dalam Jawatankuasa piawaian C, tiada perubahan yang dirancang untuk tingkah laku menyekat std::pemusnah masa hadapan dalam C 14. Walau bagaimanapun, isu itu masih dalam pertimbangan dan versi C masa hadapan boleh menangani tingkah laku ini.
Syor untuk Amalan
Untuk mengelakkan potensi masalah yang berkaitan dengan penyekatan pemusnah, adalah disyorkan untuk sentiasa memanggil get atau tunggu sebelum memusnahkan std::future yang dikembalikan oleh std::async. Ini memastikan bahawa urutan yang berkaitan telah menyelesaikan pelaksanaannya dan semua sumber yang diperlukan telah dikeluarkan.
Atas ialah kandungan terperinci Mengapa Pemusnah `std::future` Dikembalikan oleh `std::async` Menyekat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!