Rumah > pembangunan bahagian belakang > C++ > Mengapa Baris Gilir Selamat C 11 Saya Segfault Apabila Menyah Gilir daripada Baris Gilir Kosong?

Mengapa Baris Gilir Selamat C 11 Saya Segfault Apabila Menyah Gilir daripada Baris Gilir Kosong?

Linda Hamilton
Lepaskan: 2024-10-30 20:34:02
asal
972 orang telah melayarinya

Why Does My C  11 Thread-Safe Queue Segfault When Dequeuing from an Empty Queue?

Pelaksanaan Gilir Selamat Benang C 11 dengan Pembolehubah Bersyarat

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

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:

  • Gunakan templat untuk baris gilir selamat benang boleh guna semula.
  • Mulakan baris gilir dalam pembina kelas dan bukannya sejajar dengan pengisytiharan.
  • Elakkan menggunakan std::lock_guard memihak kepada std::unique_lock, kerana ini memastikan mutex dibuka kunci walaupun pengecualian dilemparkan dalam bahagian kritikal.

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!

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