Rumah >pembangunan bahagian belakang >C++ >Mengapakah `std::thread` Kelihatan Menghubungi Pembina Salinan Apabila Melalui Rujukan?
std::thread Melepasi Nilai: Salin Pembina Dipanggil
Masalah:
Apabila menyampaikan hujah kepada benang menggunakan std::thread, melalui rujukan nampaknya memanggil pembina salinan. Ini diperhatikan dalam kes di mana kelas yang diluluskan mempunyai pembina salinan yang dilumpuhkan.
Penjelasan:
Secara lalai, std::thread mengambil argumennya mengikut nilai. Walaupun kemunculan rujukan dalam tandatangan fungsi, hujah sebenarnya disalin ke dalam objek benang. Dalam contoh yang diberikan, kelas Log mempunyai pembina salinannya dilumpuhkan, oleh itu ralat pengkompil apabila menghantarnya melalui rujukan.
Penyelesaian: Semantik Rujukan dengan std::reference_wrapper:
Kepada mencapai semantik rujukan, gunakan std::reference_wrapper untuk membungkus objek dan menghantarnya ke benang. Ini secara berkesan menghantar rujukan kepada objek asal tanpa membuat salinan:
std::thread newThread(session, &sock, std::ref(logger));
Pengisytiharan Fungsi Benang:
Untuk menggunakan std::ref, fungsi benang yang sepadan mesti diubah suai untuk menerima std::reference_wrapper:
static void session(tcp::socket *sock, std::reference_wrapper<Log> logger) { std::cout << " session () " << std::endl; }
Pengurusan Sepanjang Hayat:
Adalah penting untuk memastikan objek yang dilalui (dalam kes ini, pembalak) hidup lebih lama daripada benang untuk mengelakkan berjuntai rujukan.
Atas ialah kandungan terperinci Mengapakah `std::thread` Kelihatan Menghubungi Pembina Salinan Apabila Melalui Rujukan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!