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
939 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!

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