Rumah > pembangunan bahagian belakang > C++ > Mengapakah std::thread Memanggil Pembina Salin Walaupun Semasa Melalui Rujukan?

Mengapakah std::thread Memanggil Pembina Salin Walaupun Semasa Melalui Rujukan?

Linda Hamilton
Lepaskan: 2024-11-16 15:22:03
asal
188 orang telah melayarinya

Why Does std::thread Call the Copy Constructor Even When Passing by Reference?

std::thread Calls Copy Constructor When Passing by Reference

Mengirim data ke dalam thread menggunakan std::thread boleh menjadi masalah, terutamanya apabila berurusan dengan kelas yang telah melumpuhkan pembina salinan. Tingkah laku ini berpunca daripada fakta bahawa std::thread mengambil argumennya mengikut nilai.

Pertimbangkan Log kelas berikut dengan pembina salinan yang dilumpuhkan:

class Log
{
public:
    Log(const char filename[], const bool outputToConsole = false);
    virtual ~Log(void);

    // ...

private:
    // Disable copy constructor and assignment operator
    Log(const Log &);
    Log &operator=(const Log &);
};
Salin selepas log masuk

Dalam fungsi utama, Log logger objek diluluskan dengan merujuk kepada fungsi pelayan:

Log logger("ServerLog.txt", true);
server(ioService, portNumber, logger);
Salin selepas log masuk

Fungsi pelayan kemudian mencipta benang baharu dengan logger sebagai hujah:

std::thread newThread(session, &sock, logger);
Salin selepas log masuk

Walau bagaimanapun, ini menyebabkan ralat pengkompil disebabkan oleh pembina salinan yang dilumpuhkan dalam Log.

Mengapa Melewati Rujukan Memanggil Pembina Salin?

Bertentangan dengan andaian biasa, lulus melalui rujukan dalam C tidak menghalang seruan pembina salinan. Apabila menghantar rujukan, pengkompil mencipta salinan sementara objek yang dirujuk dan menghantarnya ke fungsi. Ini kerana std::thread menjangkakan hujahnya boleh disalin.

Penyelesaian: Menggunakan std::reference_wrapper

Untuk mencapai semantik rujukan dalam senario ini, anda boleh menggunakan std::reference_wrapper:

std::thread newThread(session, &sock, std::ref(logger));
Salin selepas log masuk

std::ref membungkus rujukan dengan cara yang menjadikannya kelihatan sebagai objek yang boleh disalin ke std::thread. Walau bagaimanapun, anda mesti memastikan bahawa jangka hayat objek asas (dalam kes ini, pembalak) melangkaui hayat benang.

Atas ialah kandungan terperinci Mengapakah std::thread Memanggil Pembina Salin Walaupun Semasa Melalui Rujukan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan