Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menyalurkan Rujukan Objek dengan Betul ke C 11 std::thread Functions?

Bagaimana untuk Menyalurkan Rujukan Objek dengan Betul ke C 11 std::thread Functions?

DDD
DDDasal
2024-11-26 11:47:10456semak imbas

How to Correctly Pass Object References to C  11 std::thread Functions?

Melalukan Rujukan Objek ke Fungsi Benang

Apabila bekerja dengan antara muka C 11 std::thread, seseorang mungkin menghadapi masalah apabila cuba lulus rujukan objek sebagai hujah kepada fungsi benang. Masalah ini timbul walaupun apabila menghantar integer mudah, seperti yang diperhatikan dalam kod berikut:

void foo(int& i) {
    // Do something with i
    std::cout << i << std::endl;
}

int k = 10;
std::thread t(foo, k);

Kod ini menyusun dan melaksanakan seperti yang dijangkakan, tetapi melepasi rujukan std::ostream mengakibatkan ralat kompilasi:

void foo(std::ostream& os) {
    // Do something with os
    os << "This should be printed to os" << std::endl;
}

std::thread t(foo, std::cout);

Punca Kompilasi Ralat

Ralat kompilasi berpunca daripada pembina yang dipadamkan untuk std::thread. Secara lalai, urutan menyalin hujahnya, menjadikannya mustahil untuk menghantar rujukan secara langsung.

Penyelesaian: Menggunakan std::ref

Untuk menghantar rujukan sebagai hujah kepada fungsi benang, anda mesti membungkusnya menggunakan std::ref (atau std::cref untuk rujukan berterusan). Ini mencipta pembungkus rujukan dengan semantik nilai, membenarkan salinan rujukan wujud.

std::thread t(foo, std::ref(std::cout));

Dengan menggunakan std::ref, anda boleh menghantar rujukan kepada fungsi benang, membolehkan manipulasi langsung bagi yang diluluskan objek. Walau bagaimanapun, adalah penting untuk memastikan objek yang dirujuk kekal hidup sepanjang tempoh pelaksanaan urutan.

Atas ialah kandungan terperinci Bagaimana untuk Menyalurkan Rujukan Objek dengan Betul ke C 11 std::thread Functions?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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