C 11 Thread-Safe Baris: Memahami dan Nyahpepijat
Anda menghadapi masalah pembahagian dalam pelaksanaan barisan selamat thread anda dalam fungsi dequeue(), khususnya apabila baris gilir kosong. Anomali ini timbul kerana keadaan tunggu anda, tunggu_untuk(kunci, tamat masa) tidak distrukturkan dengan betul untuk mengendalikan bangun tidur palsu.
Memahami Wake-up Palsu
Pembolehubah keadaan seperti populatedNotifier boleh mengalami bangun tidur palsu, di mana mereka dikejutkan tanpa sebarang pemberitahuan sebenar berlaku. Tingkah laku ini wujud dalam pelaksanaan berbilang benang asas dan boleh menjadi tidak dapat diramalkan.
Membetulkan Keadaan
Untuk mengelakkan bergantung pada pemberitahuan yang mungkin tidak boleh dipercayai, amalan terbaik menentukan menggunakan songsangan keadaan yang diingini sebagai asas untuk gelung while anda dalam dequeue() dan fungsi yang serupa: while (!condition). Dalam gelung ini:
Contoh Pelaksanaan
Berikut ialah versi semakan bagi fungsi dequeue() anda:
<code class="cpp">std::unique_lock<std::mutex> lock(qMutex); while (q.empty()) { c.wait(lock); if (q.empty()) { // Immediately check the condition again after acquiring the lock return std::string(); } } std::string ret = q.front(); q.pop(); return ret;</code>
Dengan mengikut garis panduan ini, anda boleh memastikan keadaan menunggu anda teguh dan tidak terdedah kepada bangun tidur palsu, menyelesaikan isu kesalahan segmentasi anda dengan berkesan.
Atas ialah kandungan terperinci Mengapa Barisan Selamat Benang Saya Fungsi Dequeue() Menyebabkan Kerosakan Segmentasi Apabila Kosong?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!