Rumah > Artikel > pembangunan bahagian belakang > Mengapa Melepasi Objek melalui Rujukan kepada std::thread Menjemput Pembina Salin?
Apabila menghantar objek ke std::thread, hujah biasanya disalin ke dalam benang, bukannya dirujuk. Tingkah laku ini bercanggah dengan jangkaan bahawa melalui rujukan harus mengelakkan pembinaan salinan. Kekeliruan berpunca daripada perbezaan antara rujukan dan penunjuk dalam C .
Dalam C , menghantar objek melalui rujukan secara amnya bermaksud menghantar alamatnya, yang bersamaan dengan lulus penunjuk. Walau bagaimanapun, std::thread mempunyai pelaksanaan khusus yang memerlukan argumennya disalin mengikut nilai.
Untuk mencapai semantik rujukan, gunakan std::reference_wrapper seperti berikut:
std::thread newThread(session, &sock, std::ref(logger));
Dengan cara ini, pembalak tidak disalin, sebaliknya rujukannya dihantar kepada utas. Ambil perhatian bahawa pembalak mesti hidup lebih lama daripada urutan.
Penggunaan std::move() tidak disyorkan dalam kes ini kerana std::thread menjangkakan argumen akan disalin. Mengalihkan objek akan memindahkan pemilikan memorinya kepada urutan, yang mungkin tidak diingini.
Jika kod anda sebelum ini berfungsi dengan std::move() tetapi kini gagal, kemungkinan versi pengkompil anda tidak melaksanakan C 11 sepenuhnya. Pertimbangkan untuk mengemas kini pengkompil anda untuk sokongan C 11 yang dipertingkatkan.
Atas ialah kandungan terperinci Mengapa Melepasi Objek melalui Rujukan kepada std::thread Menjemput Pembina Salin?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!