Melalui Rujukan Objek kepada Fungsi Benang: Memahami Cabaran
Dalam antara muka benang std::c, menghantar argumen rujukan objek ke benang fungsi boleh menghadapi ralat kompilasi. Artikel ini meneroka sebab asas ralat ini dan menyediakan penyelesaian.
Memahami Hantaran Rujukan Objek
Dalam contoh yang disediakan, integer (k) boleh dihantar ke a fungsi benang seperti berikut:
void foo(int &i) { // Do something with i std::cout << i << std::endl; } int k = 10; std::thread t(foo, k);
Walau bagaimanapun, cuba untuk menghantar rujukan ostream kepada utas fungsi menghasilkan ralat penyusunan:
void foo(std::ostream &os) { // Do something with os os << "This should be printed to os" << std::endl; } std::thread t(foo, std::cout);
Pembina yang Dipadamkan
Ralat penyusunan berakar umbi dalam fakta bahawa std::thread mempunyai pembina yang dipadamkan yang menghalang hantaran rujukan objek langsung. Ini adalah disengajakan, kerana urutan harus menyalin hujah mereka untuk mengelakkan keadaan perlumbaan.
Penyelesaian: std::ref
Untuk menghantar rujukan objek secara eksplisit, bungkusnya dengan std::ref (atau std::cref untuk rujukan berterusan). Penyelesaian ini memastikan bahawa salinan rujukan dihantar ke fungsi benang, memastikan keselamatan:
std::thread t(foo, std::ref(std::cout));
Memelihara Seumur Hidup Objek
Adalah penting untuk ambil perhatian bahawa pembalut rujukan hanya mengandungi rujukan kepada objek. Oleh itu, adalah penting untuk memastikan bahawa objek kekal hidup sepanjang pelaksanaan benang. Kegagalan berbuat demikian akan mengakibatkan tingkah laku yang tidak ditentukan.
Atas ialah kandungan terperinci Mengapa Melewati Rujukan Objek kepada C Thread Menyebabkan Ralat Penyusunan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!