Şimdi bariyer ile çalışmak için ana API'yi uygulayacağız ve bu API iş parçacığı bariyeridir.
Bekle, iş parçacığı bariyerleri ile ilgili işlevsellik ve teoriyi tartışırken API iş parçacığı bariyer
barikatından bahsetmiştik.
Bu yüzden bu API'yi iş parçacığı bariyeri olarak yeniden adlandırdık.
İplik bariyeri yerine bekle barikatı bekle.
Bunun nedeni gerçek olmasıdır.
Posix API ile dahili olarak gelen iş parçacığı bariyeri uygulaması.
Api P iplik bariyeri var mı?
Bekle, uygulamamızın standart olana mümkün olduğunca yakın olması için API'mizi de yeniden
adlandırdık.
Bu nedenle API adı thread barrier wait, thread barrier barricade ile karşılaştırıldığında daha mantıklıdır.
Doğru.
Bu yüzden kafanız karışmasın.
Başlangıç olarak, bu API'de uygulayacağımız algoritmayı açıklayayım.
Bu algoritma hiçbir şey değildir, ancak iş parçacığı bariyerinin tüm teorisinin ve işlevselliğinin sözde
kod açısından resmi bir temsilidir.
Öyleyse bu algoritmada yer alan adımları ve yan yana tartışalım.
Bu iplik bariyerini de uygulayacağız.
Bekle, API.
Doğru.
Gördüğünüz gibi, bu API'nin argümanı hiçbir şey değildir, ancak yalnızca iş parçacığı bariyerine bir işaretçidir
ve başka hiçbir şey değildir.
Şimdi bu diyagramda yeşil kutunun yine çok iş parçacıklı bir uygulama olan uygulama
kodumuzu temsil ettiğini görebilirsiniz ve birkaç iş parçacığı aynı anda bariyer noktasına çarpabilir.
Doğru.
Yani bu, iş parçacığı bariyerinin durumundaki güncellemelerin birbirini dışlayan bir şekilde yapılması gerektiği anlamına
gelir.
Bu API'de ilk adım olarak iş parçacığı bariyeri muteksini kilitlememizin nedeni de budur.
Doğru.
Ve bu API'deki son adım olarak, bu iş parçacığı bariyerinin muteks kilidini açacağız.
Doğru.
Nedeni basit ve çok anlaşılır.
İş parçacığı bariyeri aynı anda birden fazla iş parçacığı tarafından güncellenecektir ve bu nedenle durumunu güncellemeden
önce iş parçacığı bariyeri veri yapısını kilitlememiz gerekir.
Böylece bir thread barrier dot C dosyası oluşturduğumu ve bu dosyaya thread barrier dot h başlık dosyamızı
eklediğimi görebilirsiniz.
Doğru.
Ve hata ayıklama amacıyla kullanılabilmesi için iş parçacığı bariyeri veri yapısının bazı değişkenlerini
yazdırabileceğim basit bir print işlevi yazdım.
Belki de bu yazdırma işlevini kullanmayacağım ve uygulamak için tartıştığımız API bu, değil
mi?
Yani bunu bu API'nin ilk adımı olarak görebilirsiniz.
İş parçacığı bariyeri muteksini kaydettim ve bu API'nin son adımı olarak iş parçacığı bariyeri muteksinin kilidini
açacağız.
Değil mi?
Bu yüzden yapacağım ilk şey, iplik bariyerimizin eğilim aşamasında olup olmadığını kontrol etmek
olacaktır.
Doğru.
Diyelim ki bu iş parçacığı bariyerinde engellenmiş T1T2T3 iş parçacığı var.
Ve iş parçacığı bariyerimizin elden çıkarma aşamasında olduğunu varsayalım, yani bu iş parçacıkları
bariyer noktasının ötesinde yürütmelerine devam etme sürecindedir ve iş parçacığı bariyerimizin elden çıkarma aşamasında
olduğunu varsayıyoruz.
Bu, henüz yürütülmeye devam edilmemiş bazı iş parçacıkları olduğu anlamına gelir.
Değil mi?
Bu da iplik bariyerimizin meşgul olduğu anlamına geliyor.
Bu algoritmanın bir sonraki adımında yapacağım şey, bu iş parçacığı bariyerinin boolean bayrağının tekrar hazır olup olmadığını
kontrol etmektir.
Bu değer true değerine eşitse, iş parçacığı bariyerinin durumunu inceleyen iş parçacığının meşgul
koşulunda engellenmesi gerektiği anlamına gelir.
İplik bariyerinin değişkeni.
Doğru.
Bu yüzden basitçe bir koşul değişkeni için iş parçacığını engelleyeceğim.
İşte bu kadar.
Uh.
Özür dilerim.
Yaptığım bir hata, bunun yanlış koşula karşı kontrol edilmesi gerektiğidir.
Yani tekrar hazırsa, bayrak yanlışa eşittir.
Bu, iş parçacığı bariyerinin mevcut olmadığı ve senaryo buysa iş parçacığının engellenmesi gerektiği anlamına gelir.
Bunu kodumuza yansıtmak için yapacağım şey, algoritmada veya akış şemasında
tartıştığımız kod satırının aynısını yazmak olacaktır.
Yani sadece hazır olup olmadığını kontrol ettiğimi görebilirsiniz.
Yine, bayrak false'a eşitse, iş parçacığı bariyeri mevcut iş parçacığı tarafından kullanılamayacağı
için mevcut iş parçacığımı engellemiş olurum.
Bu API'yi şu anda kim çağırıyor?
Bu koşullu kutunun gecikmemesini mi tartışıyorsunuz?
İplik bariyeri meşgul değilse ne olur?
Bu durumda, mevcut iş parçacığının bariyer noktasına ulaşıp ulaşmadığı senaryosunu ele
alacağım.
Son konu mu değil mi?
Doğru.
Yani mevcut konu son konu olacaktır.
Bariyer mevcut ağırlık sayısı artı bir, bariyer eşiğine eşitse.
Doğru.
Yani bu durumda, bariyer noktasına ulaşan mevcut iş parçacığı son iş parçacığı ise.
Ardından bariyer durumunu, bariyerin eğilim aşamasında olduğunu yansıtacak şekilde güncellerim.
Bu, boolean bayrağının tekrar hazır olduğunu basitçe güncelleyeceğim anlamına gelir.
Yanlışa eşit, değil mi?
Nedeni basit, şimdi bariyerim üzerinde engellenmiş olan tüm iş parçacıklarını serbest bırakmalı.
Dolayısıyla, bir sonraki adım olarak, bu son iş parçacığı basitçe bir sinyal üretmelidir.
Bu sinyal, bu bariyerde engellenen başka bir iş parçacığı tarafından tüketilecektir ve mevcut iş parçacığım bariyer
muteksinin kilidini açarak basitçe çıkmalıdır.
Doğru.
Yani bu, bariyer noktasına henüz ulaşmış bir iş parçacığının son iş parçacığı olduğu senaryodur.
Örneğin, bariyerimizin eşik sayısının üç olduğunu ve bu iş parçacığı bariyerinde zaten engellenmiş
t bir iş parçacığı t iki olduğunu varsayalım.
Ve t üç ipliğinin bariyer noktasına çarptığını varsayalım.
İşte az önce ele aldığımız senaryo budur.
Bunu koda yansıtmak için, mevcut ağırlık sayısı artı bir bariyer eşik sayısına
eşitse, bu yürütmenin bağlamında yapıldığı mevcut iş parçacığının bariyer noktasına
ulaşan son iş parçacığı olduğu anlamına gelir ve bu durumda sadece bir sinyal üretir
ve muteksin kilidini açar ve çıkarım.
Doğru.
Ayar tekrar hazır.
Boolean bayrağının false değerini alması, iş parçacığı bariyerimizin eğilim ilerleme aşamasında olduğunu gösterir.
Şimdi bu koşullu kutunun gecikme olmamasını ele alalım.
Ya bariyer noktasına henüz ulaşmış olan konu son konu değilse?
Doğru.
Bu diyagramda, bariyer noktasına henüz ulaşan bir T2 iş parçacığımız olduğunu ve bu iş parçacığı bariyerinin eşik sayısı değerinin
üç olduğunu ve T1 iş parçacığının bu iş parçacığı bariyerinde zaten engellendiğini varsayalım.
Doğru.
Dolayısıyla bu, bu koşullu kutunun gecikme yok kısmına girecek olan senaryo olacaktır.
Şimdi bu durumda, iş parçacığı bariyerinde engellenecek olan T2 iş parçacığımız var.
Bu durumda, iş parçacığı bariyerinde kaç iş parçacığının engellendiğini takip eden
bir sayacı artıracağız, bu kadar basit.
Ve yapmamız gereken bir sonraki şey, bu T2 iş parçacığını bariyer noktasında bloke etmektir.
Bu yüzden bir API iş parçacığı koşulu çağıracağız, bekleyeceğiz ve bu yeni gelen iş parçacığını bariyer koşulu
değişkeninde engelleyeceğiz.
Bunu koda yansıtmak için, aynı komutları yazdığımı görebilirsiniz.
Mevcut ağırlık sayısı değişkeni ve bariyer koşulu değişkeninde mevcut iş parçacığını engelleyin.
Doğru.
Şimdi bu iş parçacığı bariyerinde engellenmiş bir T1 ve t2 iş parçacığımız var ve şimdi bu engellenmiş iş parçacıklarından herhangi
birinin bir sinyal alacağı bir durumu ele almamız gerekiyor.
Doğru.
Dolayısıyla, bu algoritmada bu kutunun ötesindeki kod yalnızca engellenen iş parçacığı bir sinyal aldığında çalışacaktır.
Bu da bariyer noktasında engellenen iş parçacıklarından birinin bir sinyal aldığı anlamına gelir.
Yani, örneğin, T2 iş parçacığının bir sinyal aldığını ve yürütmeye devam ettiğini varsayalım.
Yani yapmamız gereken ilk şey sayaç değerini azaltmak, değil mi?
Çünkü iş parçacıklarından biri artık yürütülmeye başlamıştır.
Böylece bariyer noktasında engellenen toplam iş parçacığı sayısı bir azalacaktır.
Şimdi bariyer noktasını terk eden iş parçacığının son iş parçacığı olup olmadığı senaryosunu ele almamız gerekiyor.
Son iş parçacığı değilse, o iş parçacığı bir sinyal üretmelidir.
Eğer son iş parçacığı ise, o zaman söz konusu iş parçacığı bir sinyal üretmemelidir.
Doğru.
Dolayısıyla, bu değişkeni kontrol ederek bunu kolayca kontrol edebilirsiniz.
Mevcut hız sayısı sıfıra eşitse, bu, bariyer noktasını terk eden iş parçacığının bariyer noktasını terk
eden son iş parçacığı olmadığı anlamına gelir.
Bu durumda T2 iş parçacığı, bu bariyer noktasında engellenmiş olan başka bir iş parçacığı için bir sinyal
üretecektir.
Doğru.
Böylece T2 olan mevcut iş parçacığının basitçe bir sinyal üreteceğini görebilirsiniz.
Muteksin kilidini açın ve bu doğru şekilde yapılır.
Ama şimdi bu koşullu kutunun evet gecikmesini ele alalım.
Bariyer noktasını terk eden iş parçacığı son iş parçacığıysa, bu durumda bu iş parçacığı bariyerinin elden
çıkarma aşamasını şu şekilde işaretlememiz gerekir.
Bitti.
Yani bu, tekrar hazır boolean değişkenini true olarak işaretleyeceğimiz ve bu iş parçacığının sadece meşgul koşul değişkenini
veya iş parçacığı bariyerini yayınlaması gerektiği anlamına gelir.
Çünkü iş parçacığı bariyerinin yerleştirme aşaması devam ederken, çok sayıda iş parçacığı olabilir.
Diyelim ki T 4 ila 5 t altı meşgul koşul değişkeninde bloke edildi.
Doğru.
Uygulamamızın çok iş parçacıklı olduğu varsayıldığından, iş parçacığı bariyerine erişmek için herhangi bir sayıda iş parçacığı
gelebilir.
Dolayısıyla, son iş parçacığı bariyer noktasından ayrıldığında, meşgul koşul değişkeninde engellenen tüm iş parçacıklarına
bir iş parçacığı bariyerinin meşgul olduğunu söylemek son iş parçacığının sorumluluğundadır.
Git ve eriş.
Doğru.
Ve bundan sonra son iş parçacığı sadece muteksin kilidini açar ve son iş parçacığının da işi biter.
Bunu koda yansıtmak için fazladan bir şey yapmadığımı görebilirsiniz.
Algoritmada tartıştığımız kod parçasının aynısını yazıyorum.
Burada her iki senaryoyu da ele aldığımı görebilirsiniz.
Bu, bariyer noktasını terk eden ipliğin son iplik olduğu durumdur ve diğer kısım
bunu kapsayan durumdur.
Bariyer noktasını terk eden iplik son iplik değildir.
Burada bahsetmeyi unuttuğum bir şey var, bunu kullanmak yerine while kullanmamız gerekiyorsa, bunu zaten prequel kursunda
oldukça ayrıntılı bir şekilde tartıştık çünkü bu while döngüsü sahte uyanmaları önlemek
için kullanılıyor.
Doğru.
Böylece iplik bariyeri işlevselliğini ele almış olduk.
Bu akış şemasını tekrar gözden geçirmenizi, iplik bariyerlerinin işlevselliğini yansıtması için işlerin
nasıl bir araya getirildiğini anlamaya çalışmanızı öneririm.
Bir sonraki ders videosunda, iş parçacığı bariyerlerinin kullanımını gösteren kısa bir demo program yazacağız.