C++’ta eşzamanlılık ve bellek modeli
std::thread, kilitler, future, atomikler ve paralel algoritmalarla eşzamanlı C++ yazar, yarışları ThreadSanitizer ile bulup bellek modeline göre düzeltirsin.
Seviye 401 · 19 ders · 15 pratik lab
Dersler
İş parçacıkları
- std::thread ve std::jthread
- mutex, lock_guard ve scoped_lock
- condition_variable ve sahte uyanmalar
- shared_mutex ile okuma ağırlıklı veri
- stop_token ile iş birlikçi iptal
- Kısa görev: iş parçacığı güvenli önbellek
Görevler ve sonuçlar
- future, promise ve async
- packaged_task ve iş kuyruğu
- İş parçacığı havuzu yazmak
- Paralel algoritmalar: yürütme ilkeleri
- latch, barrier ve counting_semaphore
- Kısa görev: paralel dosya arama
Bellek modeli
- std::atomic ve bellek sıralamaları
- Önce gerçekleşir ilişkisi ve veri yarışı
- Kilitsiz tek üretici tek tüketici kuyruğu
- Yanlış paylaşım ve önbellek satırları
- ThreadSanitizer ile yarışları kanıtlamak
- Kısa görev: üç yarışı bul ve düzelt
Bitirme
- Bitirme görevi: geri basınçlı çok aşamalı işleme hattı
Pratik lablar
- Toplamı jthread ile parçalara bölmek: Büyük bir vektörün toplamını dört std::jthread ile parçalara bölerek hesapla ve sonucun tek iş parçacıklı sürümle aynı olduğunu göster.
- İki hesap arasında kilitlenmesiz aktarım: Yelkovan Bankası'nın karşılıklı aktarım kodundaki kilitlenmeyi std::scoped_lock ile gider ve toplam bakiyenin korunduğunu testle göster.
- Okuma ağırlıklı önbelleği iş parçacığı güvenli yapmak: Tek mutex ile yavaşlayan önbelleği shared_mutex ile okuyuculara açık hale getir; yarış olmadığını TSan ile, hızlanmayı ölçümle kanıtla.
- Koşul değişkeninde yüklemle beklemek: Sahte uyanmada boş kuyruktan okuyan tüketiciyi yüklemli wait ile düzelt.
- İşçiyi stop_token ile durdurmak: Sonsuz döngüde çalışan işçiyi stop_token ve condition_variable_any ile uykudayken bile hemen durabilir yap.
- Kapatılabilen sınırlı kuyruk yazmak: Dolunca üreticiyi, boşalınca tüketiciyi bekleten sınırlı kuyruğu yaz; kapatma çağrısı bekleyen herkesi uyandırmalı ve kalan öğeler kaybolmamalı.
- İki sorguyu std::async ile eşzamanlı çalıştırmak: Ardışık çalışan iki yavaş sorguyu std::async ve future ile eşzamanlı çalıştır ve istisnanın çağırana ulaştığını test et.
- packaged_task ile iş kuyruğu kurmak: Gönderilen her iş için future döndüren tek işçili kuyruğu packaged_task ile yaz ve işlerin gönderim sırasıyla çalıştığını doğrula.
- İş düşüren iş parçacığı havuzunu onarmak: Yıkıcıda kimi işleri düşüren ve ara sıra takılan havuzu, bekleyen işleri bitirip tüm işçileri birleştirerek kapanacak şekilde onar; bin kez yinelenen testi geç.
- İşçileri latch ile aynı anda başlatmak: Sekiz işçinin hazır olmasını std::latch ile bekle, hepsini aynı anda başlat ve bitişlerini ikinci bir latch ile topla.
- Eşzamanlı indirmeleri semaforla sınırlamak: counting_semaphore ile aynı anda en çok üç sahte indirme çalışmasını sağla; sınırın aşılmadığını ve istisnada iznin geri verildiğini test et.
- Dosya ağacında paralel arama: Bir dizin ağacında metin arayan aracı çalışma kuyruğu ve işçilerle paralelleştir; sonuçlar tekrarsız ve sıralı çıksın, hızlanma ölçülsün.
- İstek sayacını atomik yapmak: Birçok iş parçacığının artırdığı düz int sayacı std::atomic ile değiştir ve TSan uyarısının kalktığını göster.
- Yanlış paylaşımı hizalamayla gidermek: Yan yana duran iş parçacığı başına sayaçların aynı önbellek satırını paylaştığını ölçümle göster ve hizalamayla ayırıp hızlanmayı raporla.
- Tek üretici tek tüketici kilitsiz kuyruk: Halka tampon üzerinde kilitsiz kuyruğu doğru bellek sıralarıyla yaz; milyon öğelik aktarımda kayıp ve tekrar olmadığını ve TSan'ın temiz çıktığını göster.
Kurs hakkında
std::thread, kilitler, future, atomikler ve paralel algoritmalarla eşzamanlı C++ yazar, yarışları ThreadSanitizer ile bulup bellek modeline göre düzeltirsin.
Ne öğreneceksin
- İş parçacıkları
- Görevler ve sonuçlar
- Bellek modeli
- Bitirme
Ön koşullar
Aynı yolun 301 düzeyine kadar olan konularını uygulamış olmalısın.
Lab ortamı
Dersler, tarayıcında açılan sana özel bir Kali Linux terminalinde geçer. Kurulum gerekmez; lab her derste temiz başlar.
Sık sorulan sorular
- Bu kurs benim düzeyime uygun mu?
- Kurs 401 düzeyindedir; daha düşük düzeydeki kursların konularını bildiğin varsayılır.
- Kurulum gerekir mi?
- Hayır. Her ders tarayıcında açılan sana özel bir lab ortamında geçer.
- Dersler nasıl işleniyor?
- Her ders 8 ile 10 adımdan ve bir kısa sınavdan oluşur. İlk adımlarda yazman gereken komut gösterilir, sonraki adımlarda yardım azalır; iki denemede takılırsan çözüm açılır.
- Ücretsiz deneyebilir miyim?
- Evet. Her kursun ilk üç dersi ücretsizdir.