Rumah  >  Artikel  >  pembangunan bahagian belakang  >  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
Linda Hamiltonasal
2024-10-30 20:34:02785semak imbas

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>

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:
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