std::thread and Copy Constructors: Understanding the Pass-by-Reference Conundrum
std::thread, bahagian penting dalam moden Keupayaan multithreading C, memberikan dilema apabila menghantar objek dengan rujukan. Ini disebabkan oleh perbezaan asas antara cara bahasa mengendalikan rujukan dan cara std::thread memproses hujahnya.
Apabila menghantar objek melalui rujukan, kami menjangkakan pembina salinan akan dipintas kerana rujukan bertindak sebagai alias kepada objek asal. Walau bagaimanapun, andaian ini tidak berlaku untuk std::thread. Inilah sebabnya.
std::thread's Argument Handling
Bertentangan dengan jangkaan kami, std::thread memberikan hujahnya mengikut nilai. Objek fungsi diisytiharkan, menerima parameter yang sama seperti benang, dan kemudian dipanggil dengan argumen yang disediakan. Ini bermakna setiap hujah disalin ke dalam objek fungsi, walaupun ia diluluskan sebagai rujukan.
Pembina Salinan Peribadi dan Penyusunan Gagal
Dalam kod yang disediakan, Kelas log sengaja melumpuhkan pembina salinan dengan menjadikannya peribadi. Apabila std::thread cuba menyalin logger ke dalam objek fungsi, ia mencetuskan ralat kompilasi kerana pembina salinan peribadi tidak boleh diakses.
Menyelesaikan Isu dengan std::reference_wrapper
Untuk mendapatkan semula semantik rujukan apabila menghantar argumen kepada std::thread, kami boleh menggunakan std::reference_wrapper. Membungkus rujukan dengan std::reference_wrapper memastikan bahawa objek fungsi menerima rujukan kepada objek asal, mengelakkan perangkap penyalinan nilai.
Kod Menggunakan std::reference_wrapper
std::thread newThread(session, &sock, std::ref(logger));
Dalam contoh yang diperbetulkan ini, pengkompil dapat mencipta dengan betul std::benang objek kerana pembalak kini dibalut dengan std::reference_wrapper, mengekalkan status rujukannya.
Atas ialah kandungan terperinci Mengapakah `std::thread` Tidak Memintas Menyalin Pembina Apabila Menghantar Hujah melalui Rujukan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!