Rumah >pembangunan bahagian belakang >C++ >Mengapa Melewati Rujukan Objek kepada C Thread Menyebabkan Ralat Penyusunan?

Mengapa Melewati Rujukan Objek kepada C Thread Menyebabkan Ralat Penyusunan?

Linda Hamilton
Linda Hamiltonasal
2024-12-03 12:10:16616semak imbas

Why Does Passing Object References to C   Threads Cause Compilation Errors?

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!

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