Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menyalurkan Rujukan Objek dengan Betul ke 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!