Koşul Değişkenleri ve İşçi Kalıpları
İş parçacıklarını std::condition_variable ve klasik işçi havuzu kalıbıyla eşgüdümleyin
Koşul Değişkenleri ve İşçi Kalıpları, CoddyKit'te ücretsiz bir C++ Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C++ Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C++ Academy kursu toplamda 4 dersten oluşur.
Koşul Değişkeni Nedir?
Bir koşul değişkeni, başka bir iş parçacığının bir koşulun değiştiğini bildirmesine kadar bir iş parçacığının beklemesini sağlar. Üreticileri ve tüketicileri koordine etmek için kullanılır.
std::condition_variable Temelleri
Bir koşul değişkeni, bir std::mutex ve bir predicate ile birlikte çalışır. Bekleyen iş parçacığı beklerken kilidi bırakır ve uyandırıldığında kilidi yeniden alır.
#include <condition_variable>
#include <mutex>
#include <queue>
std::mutex mtx;
std::condition_variable cv;
std::queue<int> tasks;
bool done = false;Bir Koşulu Bekleme
cv.wait(lock, predicate) kullanın. Bu çağrı, karşılıklı dışlama kilidini atomik olarak açar ve bildirim gelene kadar uyur. Uyandığında kilidi yeniden alır ve predicate değerini denetler; değer yanlışsa yeniden uyur.
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [] { return !tasks.empty() || done; });Bildirim gönderme
Üretici iş parçacığı, durumu değiştirdikten sonra cv.notify_one() veya cv.notify_all() çağrısını yapar. Durum değiştirilirken kilit tutulmalıdır.
{
std::lock_guard<std::mutex> lock(mtx);
tasks.push(42);
}
cv.notify_one();Üretici-Tüketici Örüntüsü
Klasik örnek: üreticiler görevleri kuyruğa ekler; tüketiciler görevleri bekler.
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);
}
}Spurious Uyanmalar
Bir koşul değişkenini bekleyen iş parçacığı, bildirim gelmeden de uyanabilir. Bu nedenle wait bir koşul alır; her uyanışta koşulu yeniden denetler.
notify_one ve notify_all
Tek bir bekleyen iş parçacığı ilerleyebilecekse notify_one kullanın. Durum değişikliği tüm bekleyen iş parçacıklarını etkiliyorsa notify_all kullanın (örneğin kapatma sinyali).
Zaman Aşımlı Beklemeler
wait_for(lock, duration) ve wait_until(lock, time_point), bildirim geldiğinde veya bir zaman aşımından sonra uyanır.
if (cv.wait_for(lock, 1s, [] { return ready; })) {
/* condition met */
} else {
/* timed out */
}İşçi Havuzu İskeleti
Yaygın bir örüntü: sabit sayıdaki işçi iş parçacığı, paylaşılan bir kuyruktan görevleri alır. Bunu mutex + koşul değişkeni + kuyruk + atomik durdurma bayrağıyla oluşturun.
Kayıp Uyanmalardan Kaçınma
Paylaşılan durumu her zaman değiştirin ve notify_* çağrısını, durum değiştirilirken mutex tutulacak şekilde yapın (bildirimden hemen önce serbest bırakmak uygundur; ancak sıralamanın doğru olduğundan emin olun). Aksi takdirde bekleyen bir iş parçacığı bildirimi kaçırabilir.
std::counting_semaphore (C++20)
Basit sayaç tabanlı sinyalleştirme için C++20, bazı örüntülerde koşul değişkenlerinden daha basit olan std::counting_semaphore öğesini ekledi.
Kilitlenmeye Dikkat Edin
Bir koşul değişkenini beklerken birden çok kilidi tutmak kilitlenmeye yol açabilir. Kilitleri tutarlı bir sırayla alın ve birden çok mutex için std::scoped_lock kullanın.
Kısa Denetim
Yalnızca bir bildirim beklemek istediğinizde bile cv.wait(lock, predicate) neden bir koşul alır?
Özet
Koşul değişkeni, bir durum değişikliğini bekleyen iş parçacıklarını koordine eder. Spurious uyanmaları ele almak için wait(lock, predicate) kullanın, durumu mutex altında değiştirin ve ardından notify_one veya notify_all çağrısını yapın.
Sıkça Sorulan Sorular
“Koşul Değişkenleri ve İşçi Kalıpları” dersi ücretsiz mi?
Evet — “Koşul Değişkenleri ve İşçi Kalıpları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C++ Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C++ Academy kursu toplamda 4 dersten oluşur.
“Koşul Değişkenleri ve İşçi Kalıpları” dersinde ne öğreneceğim?
İş parçacıklarını std::condition_variable ve klasik işçi havuzu kalıbıyla eşgüdümleyin C++ Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C++ Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C++ Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Koşul Değişkenleri ve İşçi Kalıpları” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C++ Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C++ Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- std::thread Birleştirme ve Ayırma
- std::mutex, lock_guard ve unique_lock
- Koşul Değişkenleri ve İşçi Kalıpları
- std::async ve std::future Temelleri