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
Lepaskan: 2024-12-03 12:10:16
asal
672 orang telah melayarinya

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);
Salin selepas log masuk

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);
Salin selepas log masuk

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));
Salin selepas log masuk

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!

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