Şimdi arkadaşlar, bir önceki ders videosunda tüketici iş parçacığı için nasıl bir sözde kod yazacağımızı ve üretici
iş parçacığı için nasıl bir sözde kod yazacağımızı öğrendik, böylece hem tüketici hem de üretici ağırlık ve sinyal API'lerini
kullanarak birbirleriyle koordine olabilirler.
Doğru.
Tüketici tarafında S1, S2, S3, S4, S5 adım numaralarını ve üretici tarafında S6, S7, S8, S9
adımlarını tartıştık ve ayrıca bu adımların her birinin tüketici ve üretici tarafındaki uygunluğunu
tartıştık.
Ancak yine de, üretici ve tüketici iş parçacığı arasındaki koordinasyonu temsil eden bu
iki sözde kod parçasında hala bir boşluk vardır.
Bu ders videosunda, boşluğun ne olduğunu ve bu boşluğun nasıl onarılabileceğini tartışacağız.
Hatırlayın, öncelikli hedeflerimizden biri tüketici iş parçacığının kuyruğu boş bulduğunda kendini
bloke etmesiydi.
Değil mi?
Bu nedenle tüketici iş parçacığı S4 adımını yalnızca kuyruğun boş olmadığı garanti edildiğinde yürütmelidir.
Doğru.
Eğer bir şekilde tüketici iş parçacığımız boş bir kuyrukta S4 numaralı adımı yürütürse, o zaman programın bu
belirli durumunu sorunlu durum olarak değerlendiririz.
Doğru.
Şimdi bu ders videosunda, size üretici ve tüketici iş parçacığının bu sözde kodları
ile tüketici iş parçacığınız T1'in boş bir kuyrukta S4 adım numarasını nasıl yürütebileceğini göstereceğim.
Başlangıç olarak, diyelim ki programımızda veya sürecimizde iki tüketici iş parçacığımız var.
T1 ipliği ve T3 ipliği.
Doğru.
Programınızda herhangi bir sayıda üretici ve tüketici iş parçacığı olabilir.
Boşluğu açıklamak için iki tüketici ipliği olduğunu düşünelim, değil mi?
Ve tabii ki bir tane de üretici ipliği var.
Şimdi tüketici iş parçacığının bu kuyruktan bir veri öğesi tüketmek istediğini varsayalım.
Bu nedenle, tüketici iş parçacığı S1 adım numarasını yürütür.
Kuyruğu boş bulur.
Bu nedenle, tüketici iş parçacığı t1, S3 sağ adım numarasında bloke olur.
Dolayısıyla, tüketici iş parçacığı sözde kodunu T1 iş parçacığı bağlamında tartışıyoruz
ve S3 adımında engellenen T1 iş parçacığıdır.
Doğru.
Şimdi T1 iş parçacığı S3 adımında engellendiği için.
Şimdi, üretici iş parçacığınızın CPU'yu doğru bir şekilde aldığını ve altıncı adımı yürütmeye başladığını ve kuyruğun
kapasitesine kadar dolu olmadığını tespit ettiğini varsayalım.
Bu nedenle bir veri elemanı üretir ve veri elemanını ürettikten sonra bu elemanı bu kuyruğa
yerleştirir.
Doğru.
Bu kutuyu üretici iş parçacığı tarafından kuyrukta bulunan bir veri öğesi olarak temsil edelim ve daha sonra üretici
iş parçacığı sekiz numaralı adımı gerçekleştirir ve bu nedenle zaten engellenmiş olan T1 iş parçacığına bir sinyal gönderilir.
Doğru.
Şimdi bu sinyal gönderilir gönderilmez, t1 iş parçacığı engellenmiş durumdan yürütmeye hazır duruma geçer.
Doğru, ancak T1 iş parçacığı, üretici iş parçacığı muteksi serbest bırakana kadar çalışmayacaktır.
Diyelim ki T2 iş parçacığı S9 adım numarasını doğru şekilde uygulayarak muteksi serbest bıraktı.
Şimdi, işin püf noktası şu.
T2 üretici iş parçacığı S9 adım numarasının yürütülmesini bitirir bitirmez.
Şimdi, işlemde yürütmek için CPU tahsis edilebilecek t1 iş parçacığı ve T3 iş parçacığı olmak üzere iki iş
parçacığı daha vardır.
Doğru.
T1 ve T3 iş parçacıklarının her ikisi de CPU tarafından yürütülebilir.
Doğru.
Şimdi sorun, CPU'nun t1 iş parçacığı yerine t3 iş parçacığını kullanması durumunda ortaya çıkacaktır.
Doğru.
Bakın, çekirdek zamanlama politikası veya iş parçacığı zamanlama politikası uyarınca CPU tarafından hangi iş parçacığının zamanlanacağı
üzerinde bir kontrolünüz yoktur.
İşletim sisteminiz CPU üzerinde yürütülecek iş parçacıklarından herhangi birini seçebilir.
Doğru.
Ve bu durumda hem T1 hem de T3 iş parçacıkları yürütülmeye hazırdır.
Değil mi?
Şimdi çekirdeğinizin veya işletim sisteminizin çalıştırmak için D3 iş parçacığını seçtiğini varsayalım.
Değil mi?
Ve D3 iş parçacığının bir tüketici iş parçacığı olduğunu zaten biliyoruz, bu nedenle şimdilik adım numarasının dokuz
olduğu anlamına geliyor.
S 94, bunun s dokuz adım numarasından sonra, ancak adım numarasından önce yürütülen bir adım olduğu anlamına gelir.
S 4.
Doğru.
Diyelim ki programınızın bu noktasında, sürecin üçte üçü olan başka bir tüketici
iş parçacığı kuyruğu tekrar boşaltıyor.
Doğru.
Unutmayın, kuyrukta bir öğe vardır ve kuyruğun bu belirli öğesini tüketen
tüketici iş parçacığı üç üçtür ve kuyruk tekrar boş duruma getirilir.
İş parçacığı üçün, iş parçacığı T2 dokuz numaralı adımı tamamladığında ve iş parçacığı T1'e CPU tahsis edilmediğinde
bu eylemi gerçekleştirdiğini hatırlayın, yani iş parçacığı t1'e herhangi bir zamanda CPU tahsis edilebilir.
Ancak, işletim sisteminiz t1 iş parçacığı yerine başka bir T3 iş parçacığını yürütmek için seçti,
bu nedenle T1 iş parçacığı henüz S4 adım numarasını yürütmedi, bu nedenle şimdi T3 iş parçacığı s 94 adım numarasını gerçekleştirdikten
sonra.
Şimdi T1 iş parçacığının CPU'yu aldığını ve S4 Doğru adımını yürüttüğünü varsayalım.
Şimdi T1 tüketici iş parçacığımızın boş bir kuyruğu tükettiğini görebilirsiniz, bu da sorun bildirimimize veya
hedefimize göre istenmeyen bir durumdur.
T1 iş parçacığımız, varsayımımıza göre problemin durumu olan boş bir kuyrukta S4 adım numarasını yürütmekle
sonuçlanır.
Doğru.
Şimdi tüketici iş parçacığının boş bir kuyrukta S4 numaralı adımı engellediği bir çözüm düşünmemiz ya
da uygulamamız gerekiyor.
Dolayısıyla bu sorun, tüketici iş parçacığının sözde kodunda yapabileceğiniz çok küçük kod değişiklikleriyle basitçe
çözülebilir.
Çözüm çok basit ve anlaşılırdır.
Sinyali aldıktan sonra uyanan tüketici iş parçacığı, kuyruğu gerçekten işlemeden önce yüklem koşulunu tekrar
kontrol etmelidir.
Doğru.
Yani bu basitçe, tüketici iş parçacığı bu sinyali aldığında ve tüketici iş parçacığı gerçekten çalışmaya başladığında,
adım numarasını gerçekleştirmek için bu yüklem koşulunu tekrar kontrol etmesi gerektiği anlamına gelir.
S4 Yani burada yapabileceğiniz basit bir küçük kod değişikliği, if koşulu yerine while koşulu
yazmanız gerektiği anlamına gelir ve hepsi bu kadar.
Tüketici iş parçacığı engellenmiş durumdan yürütmeye her başladığında, yüklem koşulunu tekrar kontrol
edecektir.
Ve eğer t1 iş parçacığı işlem yapmadan önce başka bir tüketici iş parçacığı kuyruk üzerinde işlem yaptığı için kuyruğu
boş bulursa, o zaman T1 iş parçacığı koşul değişkeni üzerinde tekrar bloke olur, bu da basitçe t1 iş
parçacığının boş bir kuyruk üzerinde asla dört adımını uygulayamayacağı anlamına gelir.
Şimdi tüketici iş parçacığı sözde kodunda S2 numaralı adımda.
Bu if'i while deyimiyle değiştirirseniz, tüketici iş parçacığı için mükemmel bir sözde kod olur ve koşul
değişkeni üzerinde iki iş parçacığını senkronize etmeniz gereken tüm çok iş parçacıklı programlarda,
üretici ve tüketici iş parçacığı için tam olarak aynı sözde kodu yazmanız gerekir.
Değil mi?
Şimdi bir sonraki slaytta ilerlerken, bunun tüketici iş parçacığı için mükemmel bir sözde kod olduğunu görebilirsiniz.
Sağ tarafta ise üretici iş parçacığı için mükemmel bir sözde kod bulunmaktadır.
Değil mi?
Dolayısıyla bunlar, uygulamanın sorun bildirimine göre genel sözde kodlardır.
Elbette burada bir yüklemi temsil eden bir fonksiyon yazmanız gerekiyor, değil mi?
Ve burada, uyandırma sırasında kritik bölümün yürütülmesini temsil eden uygulamaya özel bir çalışma gerçekleştirmeniz gerekir.
Değil mi?
Dolayısıyla bu işlev, tüketici iş parçacığınız uyandığında yürütülecek uygulamanızın kritik bölümünü
temsil eder.
Yani bu genel sözde koddur ve iş parçacığı senkronizasyon problemini ve çözümünü kodlarken aynı modeli
takip edin.
Bu, tutarlı ve somut olan üretici ve tüketici iş parçacıkları arasındaki senkronizasyon türüdür.
Çoğu iş parçacığı senkronizasyon problemi standart üretici ve tüketici problemlerine ayrıştırılabilir.
Doğru.
Gelişmiş iş parçacığı senkronizasyonu yazarken, bu sözde kodları tekrar tekrar yazacağınızı
fark edeceksiniz.
Çünkü çoğu iş parçacığı senkronizasyon problemi günün sonunda minimum boyutta üretici tüketici
problemlerine ayrıştırılabilir.
Dolayısıyla, iki iş parçacığını senkronize etmeniz gerektiğinde ve bu iki iş parçacığı aslında
aynı kaynak için rekabet ediyorsa ve iş parçacıkları üretici tüketici iş parçacıkları olarak sınıflandırılabilecek
nitelikteyse, aklınızda ikinci bir düşünce olmadan, bu iki sözde kodu kullanarak iki iş parçacığını senkronize etmeyi
düşünmelisiniz.
Değil mi?