Masalah:
Semasa melaksanakan baris gilir selamat benang, segfault berlaku apabila nyah gilir daripada baris gilir kosong. Isu ini berpunca daripada fungsi wait_for pembolehubah keadaan, yang dijangka akan kembali hanya apabila diberitahu. Walau bagaimanapun, baris gilir kadangkala kekal kosong selepas fungsi wait_for dikembalikan dengan cv_status::no_timeout.
Penyelesaian:
Pendekatan yang betul ialah menyongsangkan keadaan yang dipantau oleh keadaan pembolehubah. Dalam kes ini, q.empty() hendaklah diterbalikkan kepada !q.empty() kerana syarat yang dikehendaki ialah baris gilir mempunyai sekurang-kurangnya satu elemen. Berikut ialah kaedah dequeue yang diubah suai:
<code class="cpp">std::string FileQueue::dequeue(const std::chrono::milliseconds& timeout) { std::unique_lock<std::mutex> lock(qMutex); while (q.empty()) { if (populatedNotifier.wait_for(lock, timeout) == std::cv_status::timeout) { return std::string(); } } std::string ret = q.front(); q.pop(); return ret; }</code>
Kini, fungsi wait_for hanya akan mengembalikan cv_status::timeout jika baris gilir kekal kosong selepas tempoh tamat masa, menghalang percubaan untuk dequeue daripada baris gilir kosong.
Syor Tambahan:
Atas ialah kandungan terperinci Mengapa Baris Gilir Selamat C 11 Saya Segfault Apabila Menyah Gilir daripada Baris Gilir Kosong?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!