C++ Academy · Pelajaran

Pemboleh Ubah Keadaan dan Corak Pekerja

Selaraskan bebenang dengan std::condition_variable dan corak kumpulan pekerja klasik.

Pelajaran 3 daripada 414 langkah

Pemboleh Ubah Keadaan dan Corak Pekerja ialah pelajaran C++ Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran C++ Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.

Apakah Pemboleh Ubah Syarat?

Pemboleh ubah syarat membolehkan satu benang menunggu sehingga benang lain menandakan bahawa sesuatu syarat telah berubah. Ia digunakan untuk menyelaraskan pengeluar dan pengguna.

Asas std::condition_variable

Pemboleh ubah syarat berfungsi dengan std::mutex dan predikat. Benang yang menunggu melepaskan kunci semasa menunggu dan mendapatkannya semula apabila dibangunkan.

#include <condition_variable>
#include <mutex>
#include <queue>

std::mutex mtx;
std::condition_variable cv;
std::queue<int> tasks;
bool done = false;

Menunggu Syarat

Gunakan cv.wait(lock, predicate). Ia membuka kunci mutex secara atom dan menidurkan benang sehingga menerima pemberitahuan. Apabila dibangunkan, benang mengunci semula mutex dan memeriksa predikat; jika salah, benang tidur semula.

std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [] { return !tasks.empty() || done; });

Pemberitahuan

Utas pengeluar memanggil cv.notify_one() atau cv.notify_all() selepas mengubah keadaan. Kunci hendaklah dipegang semasa keadaan diubah.

{
    std::lock_guard<std::mutex> lock(mtx);
    tasks.push(42);
}
cv.notify_one();

Corak Pengeluar-Pengguna

Contoh klasik: pengeluar menolak tugas ke dalam baris gilir; pengguna menunggu tugas.

void consumer() {
    while (true) {
        std::unique_lock<std::mutex> lock(mtx);
        cv.wait(lock, [] { return !tasks.empty() || done; });
        if (done && tasks.empty()) break;
        int task = tasks.front();
        tasks.pop();
        lock.unlock();
        process(task);
    }
}

Pengaktifan Palsu

Utas yang menunggu pada pemboleh ubah syarat boleh terjaga tanpa pemberitahuan. Sebab itulah wait menerima predikat — ia menyemak semula setiap kali terjaga.

notify_one berbanding notify_all

Gunakan notify_one apabila seorang penunggu boleh meneruskan kemajuan. Gunakan notify_all apabila perubahan keadaan memberi kesan kepada semua penunggu, contohnya isyarat penutupan.

Penungguan Berhad Masa

wait_for(lock, duration) dan wait_until(lock, time_point) terjaga sama ada selepas pemberitahuan atau selepas tamat masa.

if (cv.wait_for(lock, 1s, [] { return ready; })) {
    /* condition met */
} else {
    /* timed out */
}

Rangka Asas Kumpulan Pekerja

Corak biasa: sekumpulan utas pekerja yang bilangannya tetap mengambil tugas daripada baris gilir dikongsi. Bina dengan mutex + pemboleh ubah syarat + baris gilir + bendera berhenti atomik.

Mengelakkan Pengaktifan Terlepas

Sentiasa ubah keadaan dikongsi dan panggil notify_* dengan mutex dipegang semasa keadaan diubah. Melepaskan mutex sejurus sebelum pemberitahuan juga tidak mengapa, tetapi pastikan susunannya betul. Jika tidak, penunggu mungkin terlepas pemberitahuan.

std::counting_semaphore (C++20)

Untuk isyarat mudah berasaskan kiraan, C++20 menambah std::counting_semaphore — lebih mudah daripada pemboleh ubah syarat untuk sesetengah corak.

Berwaspada terhadap Kebuntuan

Memegang beberapa kunci semasa menunggu pada pemboleh ubah syarat boleh menyebabkan kebuntuan. Dapatkan kunci dalam susunan yang konsisten dan gunakan std::scoped_lock untuk beberapa mutex.

Semakan Ringkas

Mengapakah cv.wait(lock, predicate) menerima predikat walaupun anda hanya mahu menunggu pemberitahuan?

Imbas Kembali

Pemboleh ubah syarat menyelaraskan utas yang menunggu perubahan keadaan. Gunakan wait(lock, predicate) untuk mengendalikan pengaktifan palsu, ubah keadaan di bawah mutex, kemudian panggil notify_one atau notify_all.

Percuma untuk bermula

Pelajari C++ dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
51
Pelajaran
203

Soalan Lazim

Adakah pelajaran “Pemboleh Ubah Keadaan dan Corak Pekerja” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran C++ Academy, termasuk “Pemboleh Ubah Keadaan dan Corak Pekerja”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Pemboleh Ubah Keadaan dan Corak Pekerja”?

Selaraskan bebenang dengan std::condition_variable dan corak kumpulan pekerja klasik. Anda berlatih C++ Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan C++ Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran C++ Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “Pemboleh Ubah Keadaan dan Corak Pekerja” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran C++ Academy ini?

Ya. Setiap pelajaran C++ Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Penyertaan dan Pemisahan std::thread
  2. std::mutex, lock_guard dan unique_lock
  3. Pemboleh Ubah Keadaan dan Corak Pekerja
  4. Asas std::async dan std::future
← Kembali ke C++ Academy