Variabel Kondisi dan Pola Pekerja
Koordinasikan thread dengan std::condition_variable dan pola kumpulan pekerja klasik
Variabel Kondisi dan Pola Pekerja adalah pelajaran C++ Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C++ Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C++ Academy mencakup 4 pelajaran total.
Apa Itu Variabel Kondisi?
Variabel kondisi memungkinkan utas menunggu hingga utas lain memberi sinyal bahwa suatu kondisi telah berubah. Variabel ini digunakan untuk mengoordinasikan produsen dan konsumen.
Dasar-Dasar std::condition_variable
Variabel kondisi bekerja bersama std::mutex dan sebuah predikat. Utas yang menunggu melepaskan kunci selama menunggu dan memperolehnya kembali saat terbangun.
#include <condition_variable>
#include <mutex>
#include <queue>
std::mutex mtx;
std::condition_variable cv;
std::queue<int> tasks;
bool done = false;Menunggu Kondisi
Gunakan cv.wait(lock, predicate). Fungsi ini secara atomik membuka kunci muteks dan menidurkan utas hingga diberi notifikasi. Saat terbangun, utas mengunci muteks kembali dan memeriksa predikat; jika salah, utas tidur lagi.
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [] { return !tasks.empty() || done; });Mengirim Notifikasi
Utas produsen memanggil cv.notify_one() atau cv.notify_all() setelah mengubah keadaan. Kunci sebaiknya dipegang selama perubahan keadaan.
{
std::lock_guard<std::mutex> lock(mtx);
tasks.push(42);
}
cv.notify_one();Pola Produsen–Konsumen
Contoh klasik: produsen memasukkan tugas; konsumen 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);
}
}Bangun Palsu
Utas yang menunggu pada variabel kondisi dapat terbangun tanpa notifikasi. Itulah sebabnya wait menerima predikat—ia memeriksa ulang setiap kali terbangun.
notify_one dibandingkan notify_all
Gunakan notify_one ketika satu penunggu dapat melanjutkan pekerjaan. Gunakan notify_all ketika perubahan keadaan memengaruhi semua penunggu, misalnya sinyal penghentian.
Penantian Berbatas Waktu
wait_for(lock, duration) dan wait_until(lock, time_point) terbangun karena notifikasi atau setelah batas waktu tercapai.
if (cv.wait_for(lock, 1s, [] { return ready; })) {
/* condition met */
} else {
/* timed out */
}Kerangka Kumpulan Pekerja
Pola umum: sekumpulan tetap utas pekerja mengambil tugas dari antrean bersama. Bangun dengan muteks + variabel kondisi + antrean + penanda penghentian atomik.
Menghindari Notifikasi yang Hilang
Selalu ubah keadaan bersama dan panggil notify_* dengan muteks dipegang selama perubahan keadaan berlangsung. Melepaskan kunci tepat sebelum notifikasi juga tidak masalah, tetapi pastikan urutannya benar. Jika tidak, penunggu dapat melewatkan notifikasi.
std::counting_semaphore (C++20)
Untuk pensinyalan sederhana berbasis hitungan, C++20 menambahkan std::counting_semaphore—lebih sederhana daripada variabel kondisi untuk beberapa pola.
Waspadai Kebuntuan
Memegang beberapa kunci saat menunggu variabel kondisi dapat menyebabkan kebuntuan. Dapatkan kunci dalam urutan yang konsisten, dan gunakan std::scoped_lock untuk beberapa muteks.
Pemeriksaan Singkat
Mengapa cv.wait(lock, predicate) menerima predikat meskipun Anda hanya ingin menunggu notifikasi?
Ringkasan
Variabel kondisi mengoordinasikan utas yang menunggu perubahan keadaan. Gunakan wait(lock, predicate) untuk menangani bangun palsu, ubah keadaan di bawah perlindungan muteks, lalu panggil notify_one atau notify_all.
Belajar C++ dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 51
- Pelajaran
- 203
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Variabel Kondisi dan Pola Pekerja” gratis?
Ya — teks lengkap “Variabel Kondisi dan Pola Pekerja” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C++ Academy, upgrade ke CoddyKit PRO. Kursus C++ Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Variabel Kondisi dan Pola Pekerja”?
Koordinasikan thread dengan std::condition_variable dan pola kumpulan pekerja klasik Kamu berlatih C++ Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C++ Academy?
Tidak diperlukan pengalaman sebelumnya. C++ Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Variabel Kondisi dan Pola Pekerja” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C++ Academy ini?
Ya. Setiap pelajaran C++ Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- std::thread: Menggabungkan dan Melepaskan
- std::mutex, lock_guard, dan unique_lock
- Variabel Kondisi dan Pola Pekerja
- Dasar std::async dan std::future