Evet arkadaşlar, şimdi birden fazla koşul değişkeni kullandığımız senaryoyu tartışalım.
Yani koşul değişkeni, bildiğimiz gibi, mutex nesnesi veya mutex değişkeni ve yüklem olarak adlandırdığımız
bir koşul ile ilişkilidir.
Şu anda koşul değişkenlerine zaten aşinayız ve koşul değişkeninin çalışması için bir
mutex ve bir yüklem gerektiğini zaten biliyoruz.
Doğru.
Muteks bu yüklem için karşılıklı münhasırlık sağlar.
Yani, bir iş parçacığı bu yüklemi kontrol ettiğinde, süreçteki başka hiçbir iş parçacığı bu yüklemin sonucunu
değiştirmemelidir.
Dolayısıyla bu muteksin görevi, bu yüklem kontrolünde karşılıklı münhasırlık sağlamaktır.
Dolayısıyla, ileriye dönük olarak, birçok koşul değişkeni aynı muteksle ve aynı anda ilişkilendirilebilir.
Ancak bir koşul değişkeni aynı anda birden fazla muteks ile ilişkilendirilemez.
Dolayısıyla, aklınızda tutmanız gereken kurallar bunlardır.
Bu yüzden konuyu detaylandırmaya çalışayım.
Birincisi, birçok koşul değişkeninin aynı anda aynı muteks ile ilişkilendirilebilmesidir.
Burada Manny kelimesine dikkat edin.
Yani, birden fazla koşul değişkeni vardır ve yalnızca bir mutex nesnesi vardır.
Diyelim ki süreçte bir t1 iş parçacığı var, bir T2 iş parçacığı var ve bir t3 iş parçacığı var,
T1 iş parçacığının kendi koşul değişkeni var.
KV bir diyelim T2 iş parçacığının cv2 ve iş parçacığı olarak adlandırılan kendi koşul değişkeni vardır.
T3'ün kendi koşul değişkeni vardır, örneğin KV üç.
Şimdi de süreç içinde bir R kaynağı olduğunu ve bu R kaynağının kendi muteksine sahip olduğunu varsayalım.
Tamam.
Unutmayın, Mutex her zaman bir kaynağın özelliğidir, oysa koşul değişkeni bir kaynağın özelliği olabileceği
gibi iş parçacığının da bir özelliği olabilir.
Bu durumda, koşul değişkenleri ilgili iş parçacıklarının özelliğidir.
Doğru.
Ve her iş parçacığının kendi koşul değişkeni vardır.
Şimdi birinci iş parçacığının kaynağı meşgul bulduğunu varsayalım.
Yani, başka bir iş parçacığı bu kaynak üzerinde zaten bir kilit almıştır, bu nedenle t iş parçacığı beklemek istemektedir.
Doğru.
Yani, kendisini engellemek ister.
Yani t iş parçacığı p iş parçacığı p iş parçacığı koşulunu çağıracaktır.
Bekle.
Kendi koşul değişkenini geçirecek ve muteksi geçirecektir.
Sağa.
İşte bu muteks.
Bu yüzden wait API'sine ikinci argüman olarak aktardığımız mutex'in kaynağa ait mutex olduğunu
hatırlayın.
Yani bu API iş parçacığı tarafından çağrılır.
Bir iş parçacığı t iki iş parçacığı koşulu olan aynı API'yi çağıracaktır.
Bekle ve kendi koşul değişkenini ve aynı muteksi geçirecektir.
Ve aynı şey iplik için de geçerli.
T 3.
Yani, p iş parçacığı koşulunu da çağıracaktır.
Bekle.
Kendi koşul değişkenini ve RCM'yi geçirecektir.
Burada birden fazla koşul değişkeninin söz konusu olduğunu, ancak muteks nesnesinin aynı olduğunu görebilirsiniz,
değil mi?
Yani şimdi tüm T1, T2 ve T3 iş parçacıkları gerçekten engellenmiş durumda.
Şimdi elimizde bir iplik olduğunu varsayalım.
Diyelim ki iş parçacığı t s ve bu iş parçacığı bir sinyal iş parçacığı ve bazı x, y, z nedenlerinden dolayı,
t s iş parçacığının t2 iş parçacığına doğru sinyal vermeyi seçtiğini varsayalım.
t1 ve t3 iş parçacıklarına sinyal göndermek istemez, sadece t2 iş parçacığının yürütmeye devam etmesini ister.
Yani thread t s, p thread koşul sinyali API'sini çağıracaktır, ancak burada geçireceği koşul değişkeni thread'in koşul
değişkeni olacaktır.
T 2.
Dolayısıyla, sinyal veren iş parçacığı bu API'yi çağırır çağırmaz, sinyal t iki iş parçacığına gidecek ve yürütmeye
devam edecek olan t2 iş parçacığı olacaktır.
Doğru.
İplik t bir ve t üç bloke olarak kalacaktır.
Böylece her bir iş parçacığının kendi koşulunu beklediğini görebilirsiniz.
Değişken, o zaman geliştiricinin iş parçacığına seçici olarak sinyal vermesi kolaylaşır.
Yani, geliştirici T1 iş parçacığını mı yoksa t2 iş parçacığını mı devam ettirmek istediğini seçebilir.
T 3.
Doğru.
Programcının sinyal API'sine argüman olarak aktaracağı sinyal değişkeni.
Bu koşul değişkenini bekleyen iş parçacığı devam ettirilecektir.
Doğru.
İş parçacığına özel koşul değişkeninin kullanılması, programcıya iş parçacıklarını seçici olarak engelleme veya devam ettirme konusunda daha fazla
güç veya daha fazla kontrol sağlar.
Şimdi, bunun aksine, aynı kaynak ah için zaten mutex m'ye sahip olduğumuzu ve bir koşul değişkenimiz
olduğunu varsayalım.
KV kaynağa özgü koşul değişkeni, değil mi?
Şimdi bu durumda yalnızca bir koşul değişkeni vardır ve bu koşul değişkeni artık kaynağa
özgüdür.
CB1, Cv2 veya cv3 koşul değişkeni yoktur.
Doğru.
Yani bu basitçe, T1 iş parçacığı kaynağın kullanılabilir hale gelmesini beklemek isterse, kaynağa
özgü olan ortak koşul değişkeninin adresini ileteceği anlamına gelir.
Benzer şekilde, T2 ve T3 iş parçacığı, kaynağa özgü koşul değişkeni CV olan aynı koşul değişkenini kullanarak kendilerini
bloke edecektir.
Doğru.
Burada üç iş parçacığının da aynı koşul değişkenini beklediğini görebilirsiniz, değil mi?
Şimdi sinyal veren iş parçacığı engelleyen iş parçacığının yürütülmesini devam ettirmek isterse, kaynağa
özgü koşul değişkeni olan bu koşul değişkeninin adresini iletecektir.
Şimdi, bu CV'nin adresini geçtikten sonra, T1T2T3 iş parçacığı arasında hangisinin engeli ilk
kaldırıp çalışacağını bilmiyoruz, değil mi?
Bilmiyoruz.
Artık iş parçacıkları arasından hangisinin bir, T, iki veya T3 olacağını seçmek işletim sistemine kalmıştır.
Yürütmeye devam etmeyi seçecektir.
Sinyal iş parçacığının yalnızca bir sinyal gönderdiğini unutmayın, bu nedenle T1T2T3 arasında yalnızca bir iş parçacığı devam ettirilecektir.
Hangi iş parçacığı olacağını bilmiyoruz, ancak işletim sistemi zamanlama politikasına bağlı olarak, aynı
koşul değişkenini bekleyen birçok iş parçacığı arasından yalnızca bir blok iş parçacığını seçecek ve yürütmeye
devam edecektir.
Şimdi bu örnekte, programcı blok iş parçacıklarına seçici olarak sinyal verme yeteneğini kaybetmiştir.
Değil mi?
Programcı, engellemeyi kaldırmak ve yürütmeye devam etmek için T2 iş parçacığını özellikle seçemez.
Doğru.
Kontrol, programcının elinden altta yatan işletim sisteminin eline geçmiştir.
Doğru.
Artık iş parçacıklarının kendi koşul değişkenlerine sahip olması ile iş parçacığının aynı koşulu
paylaşması ve bloklaması arasındaki farkı anlamışsınızdır.
Değişken.
Doğru.
İş parçacığı aynı koşul değişkenini paylaştığında, bu koşul değişkeni bir kaynağın özelliği
haline gelir.
Ancak iş parçacığı kendi bireysel koşul değişkenlerine sahip olmayı seçtiğinde, bu koşul değişkenleri kendi
iş parçacıklarının özelliğidir.
Merak etmeyin, iş parçacıklarının her birinin kendi kişisel koşul değişkenlerine sahip
olacağı belirli problem ifadelerini uygulayacağız ve programcının koşul değişkenlerini kullanarak iş parçacıklarına sinyal verme veya engelleme
konusunda nasıl daha fazla nihai kontrole sahip olabileceğini göreceğiz.