Evet, çocuklar.
Ve şimdi önümüzdeki birkaç ders videosunda, durum değişkenlerinin ağırlık ve sinyalizasyon için nasıl
kullanıldığını tartışacağız.
Doğru.
Çok iş parçacıklı programlar yazarken koşullu değişkenleri kapsamlı bir şekilde kullanacağız.
Koşul değişkenleri iş parçacığı senkronizasyonu için yaygın olarak kullanılır.
Aslında muteks ve koşul değişkenleri, gelişmiş iş parçacığı senkronizasyonu, veri yapıları ve teknikleri
için temel yapı taşlarıdır.
Bu nedenle, önümüzdeki birkaç ders videosunda, koşul değişkenlerini oldukça ayrıntılı bir şekilde
tartışacağız.
Ve basitçe, koşul değişkenleri ile ilgili sonraki üç dört ders videosunun üstünü kapatmanızı öneririm.
Umarım aklınızda hiçbir soru ya da şüphe kalmayacaktır.
Koşul değişkenleri ile ilgili tartışmaya başlarken, koşul değişkeni bir iş parçacığını engellemek ve bir iş parçacığına
sinyal vermek için kullanılır.
Bir iş parçacığını bloke etmek, bir iş parçacığını durdurmak anlamına gelir.
Doğru.
Yani bir iş parçacığını engellemek, koşul değişkenlerini kullanarak bir iş parçacığının yürütülmesini durdurmak anlamına gelir.
Bir iş parçacığına sinyal gönderilmesi ise durdurulmuş veya engellenmiş bir tehdidin yürütülmesine devam edilmesi anlamına gelir.
Şimdi ilk olarak koşul değişkeninin bir tehdidi engellemek için nasıl kullanılabileceğini tartışalım.
Bu nedenle, koşul değişkenlerini iki adımda kullanarak bir tehdit bloğunun kendisini her zaman hatırlayın.
İlk adım bir muteksi kilitlemektir.
Değil mi?
Bu diyagramda, bir t iş parçacığımız olduğunu ve koşul değişkenini kullanarak kendisini bloke etmek istediğini varsayalım.
Dolayısıyla, threat t one'ın sahip olması gereken ilk şey bir mutekse sahip olmasıdır.
Doğru.
Ve muteks başlatılmalıdır.
Yani birinci adım, iş parçacığının kendini bloke etmek için bir muteksi kilitlemesi gerektiğini söyler.
Koşul değişkenini kullanma.
Doğru.
Burada, S1 adımında T1 iş parçacığının bir muteks nesnesi üzerinde bir kilit işgal ettiğini görebilirsiniz.
Değil mi?
Ve ikinci adım, koşul değişkenini kullanarak engellenmek isteyen bir iş parçacığının bir API iş parçacığı koşulunu
çağırması gerektiğini söyler.
Bekle.
Bunun için programımızın bir koşul değişkenine sahip olması ve koşul değişkeninin ilklendirilmesi gerekir.
Doğru.
Şimdi, program başlatılmış bir koşul değişkenine sahip olduğunda, bir iş parçacığı bir API p iş parçacığı koşulunu çağırabilir.
Bekleyin ve bu API iki argüman kabul eder.
İlk argüman koşul değişkeninin adresi, ikinci argüman ise bir önceki adımda aynı iş parçacığı
tarafından kilitlenen muteks'tir.
Doğru.
Böylece üç numaralı adımda T1 iş parçacığı engellenir.
Dolayısıyla, bir iş parçacığının koşul değişkeni kullanılarak engellenmesi iki adımlı bir işlemdir.
İlk olarak muteksi kilitleyin ve ikinci olarak p thread condition wait API'sini çağırın ve koşul değişkenini ilk argüman
olarak ve muteksi ikinci argüman olarak geçirin.
Ve bu api p iş parçacığı koşulunun çağrılmasından sonra.
Bekle, başlığın engellendi.
Yani üçüncü adımda T1 iş parçacığı engellenmiştir.
Şimdi bu API hakkında bir şeyler anlamamız gerekiyor.
Bu bir iplik koşuludur.
Bekle.
Bu API perde arkasında anlamamız gereken bir şey yapıyor.
Yani bu API çağıran iş parçacığı tarafından çalıştırıldığında.
Yani iş parçacığı p iş parçacığı koşulunu çağırdığında.
Bekle.
İki şey olur.
İlk olarak, çağıran iş parçacığı engellenir.
Doğru.
Yani bu koşul değişkeninin görevi, çağıran iş parçacığının engellenmesidir.
Sahne arkasında gerçekleştirilen ikinci eylem, muteks sahipliğinin çağıran iş parçacığından alınması
ve kullanılabilir ilan edilmesidir.
Yani bu API'ye aktardığınız ikinci argüman, yani bir önceki adımda iş parçacığı tarafından
kilitlenen muteks artık sahne arkasında.
Kilidi açılmıştır ve programın başka herhangi bir iş parçacığının kilitlemesi için kullanılabilir olduğu beyan edilmiştir.
Bu nedenle, T1 iş parçacığı S3 adım numarasını bitirir bitirmez, bu koşula ikinci bir argüman olarak aktarılan
muteks, ağırlık API'si diğer iş parçacıkları tarafından günlüğe kaydedilebilir hale gelir.
Dolaylı olarak veya perde arkasında bu muteksin kilidinin açıldığını varsayabilirsiniz.
Bunu kısa süre içinde anlayacağız.
Bu muteks nesnesinin rolü nedir?
Ve işlerin neden bu şekilde yürütüldüğünü.
Doğru.
Bekle biraz.
Oraya gideceğiz.
Şimdi, T1 iş parçacığımız S3 adımında engellenmiş durumda ve muteks kullanılabilir durumda.
Şimdi programımızın kendi yürütme akışını yürüten başka bir T2 iş parçacığına sahip olduğunu varsayalım,
değil mi?
Şimdi T2 iş parçacığımızın bir sinyal iş parçacığı olduğunu, yani T2 iş parçacığımızın t1 iş parçacığının yürütülmesini devam ettirme
sorumluluğuna sahip olduğunu varsayalım.
Dolayısıyla, diğer iş parçacığı zaten engellenmiş olan iş parçacığının yürütülmesine devam etmeye çalıştığında, bu süreci sinyalizasyon olarak
adlandırıyoruz.
Doğru.
Yani sinyalizasyon yine üç adımlı bir süreçtir.
İlk adımda, T2 iş parçacığımız olan sinyalizasyon iş parçacığı bir sinyalizasyon iş parçacığıdır.
İlk adım muteksi kilitlemektir.
İkinci adım, bir api p iş parçacığı koşul sinyalini çağırmaktır.
Doğru.
Üçüncü adım ise muteksin kilidini açmaktır.
Dolayısıyla, t2 iş parçacığı t1 iş parçacığına sinyal göndermek isterse, hey t1 iş parçacığı yürütmenize devam edebilirsiniz.
Bu yüzden t2 iş parçacığı muteksi kilitlemelidir.
Bu muteks bununla aynı muteks olmalı, değil mi?
Farklı nesneler olmaları gerekmez.
Aynı olmak zorundalar.
Değil mi?
Daha sonra S8 adımında, D2 iş parçacığı bir API P iş parçacığı koşul sinyalini çağırır ve bu API'ye aktarılan
argüman bununla aynı koşul değişkenidir.
Değil mi?
Ve sekiz numaralı adım bir sinyale yönelik tehdit t tarafından yürütülür yürütülmez, bu işletim sisteminin
bu koşul değişkenine gönderdiği sinyaldir.
Değil mi?
Yani, hangi iş parçacığı bu koşulda engellenirse, değişkenin yürütülmesine devam edilmesi beklenir.
Bizim durumumuzda, bu koşul değişkeni üzerinde engellenen t iş parçacığıdır.
Yani iş parçacığı koşul sinyali, bir iş parçacığının başka bir iş parçacığına bir sinyal veya bildirim göndererek diğer iş parçacığının
engellenmiş durumdan yürütmeye devam etmesini söylemesi gibi çalışan bir API'dir.
Şimdi burada T1 iş parçacığımız bu sinyali tekrar aldığında, sahne arkasında anlamamız gereken birkaç
şey olur.
Yani burada blok iş parçacığı sinyal aldığında bunun sinyal alan bir iş parçacığı olmadığını görebilirsiniz.
Sinyali alan koşul değişkenidir.
Değil mi?
Yani bir blok iş parçacığı veya bir koşul değişkeni bir sinyal aldığında.
Blog başlığı burada.
T1 iş parçacığı olan koşul değişkeni üzerinde engellenen iş parçacığını temsil eder.
T1 iş parçacığı veya engellenen iş parçacığı yürütmeye hazır duruma geçer ve muteksin serbest kalmasını bekler.
Dolayısıyla, t1 iş parçacığımız gerçekten yürütmeye devam etmez, ancak yürütmeye hazır duruma geçer.
Doğru.
Yani burada bu kırmızı, tehdidin yürütülmeye hazır duruma girdiğini ancak aslında henüz yürütülmeye
başlamadığını temsil eder.
Sadece t tehdidinin engellenmiş durumdan yürütülmeye hazır duruma geçtiğini söylüyoruz.
İkinci nokta, muteks sinyal veren iş parçacığı tarafından serbest bırakılır bırakılmaz engellenen tehdide muteks
üzerinde bir kilit verildiğini söyler.
Doğru.
Bu noktada, tehdidin ardından T iki'nin sekiz numaralı adımını başarıyla gerçekleştirdiğini
ve sinyalin T bir tehdidine çoktan gönderildiğini varsayalım.
Şimdi t iki tehdidinin s dokuz numaralı adımı başarıyla gerçekleştirdiğini varsayalım.
Yani, tehdidin kilidi başarıyla açılmıştır.
Üzgünüz, bu API kilit açma API'sidir.
Yani T2 tehdidi muteksin kilidini başarıyla açmıştır.
Doğru.
Dolayısıyla, t iki tehdidi s dokuz numaralı adımın yürütülmesini başarıyla tamamlar tamamlamaz,
t bir tehdidi yürütmeye hazır durumdan fiilen yürütme durumuna geçer.
Bu, kişinin sahip olduğu tehdidin fiilen uygulanmaya başlaması anlamına gelir.
Doğru.
Yani bu, şu anda t1 iş parçacığının T1'in uyandığını yazdıracağı anlamına gelir.
Tam burada.
Bu print deyimi kritik bölümü temsil eder.
Doğru.
Engellenmiş durumda olan 31 şimdi yürütülmeye devam etti ve şimdi kritik bölümde yürütülüyor.
Şimdi, iş parçacığı yürütmeye başlar başlamaz, T1 iş parçacığına muteks üzerinde bir kilit verildiğine dikkat edin.
Dolayısıyla, T1 iş parçacığı gerçekten yürütüldüğünde veya yazdırıldığında, bu T1 bu satırdaki mesajla uyandırılır.
Bu özel muteks, t1 iş parçacığı tarafından otomatik olarak kilitlenir.
Unutmayın, iş parçacığı sinyali alır almaz yürütmeye hazır durumuna geçer.
Ve sinyal veren iş parçacığı muteks üzerindeki kilidi serbest bırakır bırakmaz, kilit sinyali alan iş parçacığı
tarafından derhal işgal edilir.
Doğru.
Ve ardından iş parçacığı yürütülmeye başlar.
Doğru.
Ben de tam olarak aynı adımları izliyorum.
Dolayısıyla, 31 yürütmeye devam edip bu mesajı yazdırdığında, bu muteks T1 Right iş parçacığı tarafından
günlüğe kaydedilir.
Yani bu mesaj aslında kritik bölümü temsil ediyor, değil mi?
Bu yüzden endişelenmeyin, bir sonraki ders videosunda bir örnek yardımıyla tam olarak aynı prosedürü
tartışacağız.
Dolayısıyla, bu kritik bölüm T1 iş parçacığı tarafından başarıyla yürütüldüğünde, t1 iş parçacığı artık aynı muteksin
kilidini açabilir.
Doğru.
Bu yüzden S1, S3 ve S5 adımlarını açıkladım.
S2 ve S4 adımlarının nerede olduğunu ve adımın nerede olduğunu düşünüyor olmalısınız.
S7 Doğru.
Bu adımları bir sonraki ders videosunda tartışacağız.
Umarım bu ders videosu, T1 tehdidinin kendisini engellemek için koşul değişkenini nasıl kullandığını anlamanıza yardımcı
olur.
Sinyal iş parçacığının blok iş parçacığına sinyal göndermek için koşul değişkenini nasıl kullandığı ve blok iş parçacığının
engellenmiş durumdan yürütmeye nasıl devam ettiği.
Bu kural, p iş parçacığı koşulunun arkasındaki ana mantığı temsil eder.
Wait API ve p thread condition signal API.
Doğru.
t1 iş parçacığı bu p iş parçacığı koşulu kullanılarak engellendiğinde bu muteksin kilidinin otomatik olarak açılacağını
unutmayın.
Wait API ve t1 iş parçacığı bu sinyali alır almaz, t1 iş parçacığı yürütmeye hazır durumuna
geçer.
Doğru ve t1 iş parçacığı yalnızca sinyal iş parçacığı olduğunda yürütmeye hazır durumundan fiilen yürütme durumuna
geçecektir.
T2 muteksin kilidini açar.
Doğru.
Muteksin kilidi sinyal veren iş parçacığı tarafından açılır açılmaz, engelleyen iş parçacığı muteks üzerinde kilitlenir
ve aslında hazır durumdan yürütme durumuna geçer.
Doğru.
Bu ders videosunda ele aldığımız tüm adımların özetini bir kez daha gözden geçirdim.
Şimdi, bir sonraki ders videosunda, bir alıştırma daha yapalım ve bekleme ve sinyalizasyonun nasıl çalıştığını anlamaya
çalışalım.
Ve bunu bir örnek yardımıyla tartışacağız.
Bu, bir kaynak olarak hareket eden bazı veri yapılarını alarak ve bu kaynak için rekabet eden iş parçacıkları
vardır.