Şimdi çocuklar p thread condition broadcast API'sini tartışacağız.
Bu yüzden önce bunu tartışacağız.
Bu API'nin kullanımı nedir ve daha sonra bu API'nin perde arkasında nasıl çalıştığını tartışacağız.
Adından da anlaşılacağı gibi, bu API aynı koşul değişkeni üzerinde bloke olan birden fazla iş parçacığına sinyal göndermek
için kullanılır.
Şimdi bunu bir örnek yardımıyla anlayalım.
Diyelim ki işleminizde g1 iş parçacığı, T2 ve T3 olmak üzere üç iş parçacığı var.
Değil mi?
Ve bu iş parçacıklarının her biri aynı koşul değişkeni üzerinde engellenir.
Doğru.
Bu nedenle, iş parçacığı koşul yayınının aynı koşul değişkeni üzerinde engellenen birden fazla iş parçacığına sinyal göndermek için kullanılan
bir API olduğunu unutmayın.
Şimdi programınızda T1, T2 ve T3 iş parçacığı aynı koşul değişkeni üzerinde engelleniyor.
Sürecin bir diğer halkası.
Sinyalizasyon iş parçacığı anlamına gelen ts iş parçacığı diyelim.
API p iş parçacığı koşulu sinyalini çağırır.
Özür dilerim.
Bir api p iş parçacığı koşul yayını çağırır.
Doğru.
Bu API'nin argümanı da aynı koşul değişkenidir.
Doğru.
Yani perde arkasında yapacağı şey, aynı koşul değişkeni üzerinde bloke olan bu iş parçacıklarının her birine
sinyal göndermek olacaktır.
Doğru.
Ve tüm bu iş parçacıkları teker teker yürütülmeye devam edecektir, Doğru.
Teker teker derken neyi kastettiğimizi daha ayrıntılı olarak tartışacağız, iş parçacıkları aynı anda
değil, teker teker yürütülmeye devam eder.
Yani bu yayın API'sinin kullanımı budur.
Bu yayın API'sini x, y, z gibi bir nedenle kullanmak istemiyorsanız ve yine de engellenen tüm iş parçacıklarının
yürütmeye devam etmesini istiyorsanız, o zaman p iş parçacığı koşulu sinyal API'sini ayrı ayrı çağırmanız gerekir.
Koşul değişkeninde, değil mi?
Ve aynı koşul değişkeni üzerinde bloke olan üç iş parçacığı olduğundan, bu
API'yi üç kez çağırmanız gerekir, değil mi?
Ve blok iş parçacıklarının engelini kaldırmak ve yürütmeye devam etmek istediği sırayı seçmenin işletim sistemine
bağlı olduğunu zaten biliyoruz.
İş parçacıklarına seçici olarak sinyal vermek kesinlikle programcının kontrolünde değildir.
Doğru.
Benzer şekilde, sinyal iş parçacığı api p iş parçacığı koşul yayınını çağırdığında, bu T1T2T3 iş parçacıklarının
hangi sırayla engellemeyi kaldıracağını ve yürütmeye devam edeceğini söyleyemeyiz.
Her şey işletim sisteminizin zamanlama politikasına bağlıdır; x, y, z gibi bir nedenle hangi iş parçacığının
engelini kaldırıp önce yürütmeye devam edeceğini seçer.
Doğru.
Yani iş parçacığı koşulu yayın API'si bu şekilde çalışır.
Ve programınızda, p thread koşul yayını yerine p thread koşul sinyali kullanırsanız, aynı koşul değişkeninde
engellenen tüm iş parçacıklarının devam ettirildiğinden emin olmak için bu koşul değişkeninde bekleyen
iş parçacığı sayısı kadar sinyal göndermeniz gerekir.
Doğru.
Şimdi.
Daha sonra, p thread condition broadcast API'sinin sahne arkasında nasıl çalıştığını tartışacağız.
Tartışmamıza devam edersek, sürecinizdeki sinyalizasyon iş parçacığı olan dördüncü
iş parçacığının, T1, T2 ve T3 iş parçacıklarının bloke edildiği aynı koşul değişkeni olan bağımsız değişken
koşul değişkeni üzerinde P iş parçacığı koşul yayın API'sini çağırdığını varsayalım.
Şu anda.
Dediğim gibi, programcının T1, T2 ve T3 iş parçacıklarının hangi sırayla uyandırılacağını kontrol
edecek bir kontrolü yok.
Bu yayın API'sinin işleyişini göstermek için, iş parçacıklarının T2, T1 ve T3 sırasına
göre uyandırıldığını varsayalım.
Doğru.
Şimdi bu iş parçacıklarının her birinin bu sırayla nasıl uyandırılacağını adım adım tartışalım.
T2T1T3.
Unutmayın, bu sıra işletim sisteminizin zamanlama politikasına bağlı olarak herhangi bir şey olabilir.
Şimdi bu üç iş parçacığının bu sırayla nasıl uyandırılacağına ilişkin adımları gözden geçirelim.
Yani t iki, t bir ve t üç.
Dolayısıyla, sinyalizasyon iş parçacığı bu API'yi çağırır çağırmaz, üç iş parçacığı da engellenmiş durumdan yürütmeye
hazır duruma geçecektir.
Doğru.
Benzer şekilde, T2 tehdidi de engellenmiş durumdan yürütmeye hazır duruma ve tehdide geçecektir.
T3 de engellenmiş durumdan yürütmeye hazır duruma geçecektir.
Şu anda, işletim sisteminin yürütmeye devam etmek için T2 iş parçacığını seçtiğini varsaydık.
Bu da basitçe T2 iş parçacığının bu mutekse kilitlenen ilk iş parçacığı olacağı ve bu mutekse kilitlenir
kilitlenmez T2 iş parçacığının hazır durumdan yürütme durumuna geçeceği anlamına
gelir.
Yani, yürütmeye devam edecek olan iş parçacığı T2'dir.
Böylece çıktıyı yazdıracaktır.
T 2.
Doğru.
Şimdi, unutmayın, zamanın bu noktasında, iş parçacığını yürüten yalnızca t iki iş parçacığıdır.
T bir ve t üç hala çalışmıyor.
Doğru.
Dolayısıyla, t iki iş parçacığı muteksin kilidini açar açmaz, şimdi t bir ve t üç iş parçacığı bu muteks üzerinde kilit
için yarışacaktır.
Doğru.
Dolayısıyla, sıramıza göre, bu muteks üzerinde kilit alanın t iş parçacığı olduğunu varsayalım.
Böylece t bir iş parçacığı şimdi hazır durumdan yürütme durumuna geçecektir.
Yani bu basitçe, bir sonraki yürütülecek olan iş parçacığının T1 olduğu anlamına gelir.
Böylece t1 iş parçacığını doğru yazdıracaktır.
Ve D1 tehdidi muteksin kilidini açtığında, yürütmeye hazır durumda olan tek iş parçacığı T3
iş parçacığıdır ve hazır durumdan yürütme durumuna geçecek olan T3 iş parçacığıdır.
Doğru, yani tehdit T üç.
Üç tane basacağım.
Ve şimdi de tehdit üç olunca.
Muteksin kilidini açar, tüm tehdit T1T2 ve üç üç kritik bölümlerinin dışındadır.
Tehdit T1, T2 ve T3 kritik bölümlerinin dışına çıktığında, tehdit.
T1, T2 ve T3 eş zamanlı olarak çalışacaktır.
Yani, CPU'nun T1, T2 ve T3 tehditlerine hangi sırayla tahsis edileceği artık işletim sistemi
bağlam değiştirme ve zamanlama politikasına bağlıdır.
T1 kritik bölümün dışında T2 kritik bölümün dışında veya T3 kritik bölümün dışında olan bu dizelerin
hangi sırada yazdırılacağına dair bir şey söyleyemeyiz.
Bunlar, işletim sisteminin blok iş parçacığının yürütülmesini hangi sırada sürdürmeyi seçtiğine bakılmaksızın
herhangi bir sırada yazdırılabilir.
Sinyalizasyon iş parçacığı yayın API'sini çağırdığında.
Doğru.
Dolayısıyla, işletim sisteminiz T2T1 ve T üç sırasındaki iş parçacıklarının engelini kaldırmayı seçtiğinde,
aynı sırayla t iki, t bir ve T üç çıktılarına sahip olacağınız garanti edilir.
Ancak bu dizeler herhangi bir sırada yazdırılabilir çünkü bu dizelerin her biri kritik bölümlerin dışındadır.
Doğru.
Yani bir yayın API'si bu şekilde çalışır.
Yayın API'si aynı koşul değişkeni üzerinde bloke olan tüm iş parçacıklarının blokesini teker teker kaldırır.
Doğru.
Bu konuların her biri kendi kritik bölümlerinden çıkacaktır.
Ve işletim sisteminin seçtiği sıra.
Doğru.
Ancak kritik bölümden her seferinde yalnızca bir iş parçacığının çıkacağı garanti edilir.
Ve kritik bölümün tanımı gereği, aynı anda yalnızca bir iş parçacığı tarafından yürütülen bir kod parçası
olması mantıklıdır.
Doğru.
Dolayısıyla karşılıklı dışlama ilkesi asla ihlal edilmemelidir.