Tekrar hoş geldiniz çocuklar.
Şimdi, bu ders videosunda, sadece muteksler ve koşul değişkenleri kullanarak kendi semaforlarınızı nasıl
uygulayabileceğinizi tartışacağım.
Zaten bir program yazdık ve dahili semaforları kullandık.
Doğru.
Posix kütüphanesi tarafından sağlanan standart semaforları kullanarak zaten sıkı bir değişim
programı yazdık.
Şimdi kendi semaforlarımızı uygulamak iyi bir alıştırma olacaktır, böylece muteks ve koşul değişkenlerini
kullanarak kendi semaforlarımızı nasıl uygulayacağımız konusunda pratik yapabiliriz, böylece gelecekte
daha gelişmiş semaforlar uygulamamız gerekirse bunu yapabiliriz, değil mi?
Yani bir semaforu temsil eden bir yapı tanımlayacaktık ve aslında semaforlar üzerinde gerçekleştirilecek
işlemleri temsil eden bir API tanımlayacaktık.
Doğru.
Sol taraftaki yapının üç üye içeren bir semafor yapısını temsil ettiğini görebilirsiniz.
İzin sayacı.
Semaforun tüm işlevselliğinin bir izin sayacı tamsayı değişkeninin korunmasına bağlı olduğunu
zaten biliyoruz.
Değil mi?
Ve mutex'in yanı sıra bir koşul değişkenimiz var mutex, semaforun sayaç değerini iş parçacıkları tarafından karşılıklı olarak
özel bir şekilde güncellemek için kilitlenecek ve kilidi açılacaktır.
Bir iş parçacığının semafor üzerinde beklemesi veya bloke olması gerektiğinde sağ ve koşul değişkeni kullanılacaktır.
Doğru.
Bunun için koşul değişkeni kullanırız.
Sağ taraftaki API'ler semafor üzerinde gerçekleştirilecek işlemleri temsil eder.
Ve bu API'lerin prototipi veya imzası standart olanlarla neredeyse aynıdır.
Bu API'lerin imzasını standart API'lerle aynı tutmak için elimden geleni yaptım.
Örneğin, standart API aynı ağırlığı kullandığımızı görebilirsiniz, ancak burada sigma alt çizgi ağırlığını
kullanacağız, değil mi?
Benzer şekilde, aynı yazı yerine Sigma yazısını kullanacağız, değil mi?
Bu yüzden kendi semaforumuzu bu yolda bulunan dot h ve sigma dot c dosyasında uygulayacağız.
Multithreading Bible slash semaforları.
Doğru.
Şimdi başlamak için, size sigma nokta H olan başlık dosyasını göstereyim.
Şimdi sigma dot h dosyasındayım ve semaforu temsil eden veri yapılarını tanımladığımı ve semaforumuz
üzerindeki işlemleri temsil eden tüm API'leri bildirdiğimi görebilirsiniz.
Bu yüzden API'yi, ağırlığı, gönderiyi uygulamanız, yok etmeniz ve değeri doğru almanız gerekir.
Bunlar genellikle semaforlar üzerinde işlem yapmak için kullandığımız API'lerdir.
Şu anda, internette gezinirseniz veya internette bulunan bazı referanslara başvurursanız, semafor üzerindeki
ağırlık ve post işlemlerinin de P ve V konvansiyonları kullanılarak temsil edildiğini görürsünüz; burada
P semafor üzerindeki bir ağırlık işlemini temsil ederken, V semaforun post işlemini
temsil eder.
Semafor üzerindeki ağırlık ve son işlemi temsil etmek için bir başka yöntem de yukarı ve aşağı kullanmaktır.
Bu nedenle, farklı etiketlere veya farklı referanslara başvurursanız, semafor üzerindeki ağırlık ve post işlemlerinin P veya
V ile temsil edilebileceğini veya rekabetçi sınavlarda yukarı ve aşağı kullanımının kurulabileceğini görebilirsiniz.
P ve V'yi ağırlık ve postaya kıyasla daha yaygın olarak bulabilirsiniz.
Doğru.
İşte bu yüzden ağırlık ve postaya kadar genişleyen kısa bir makro oluşturdum.
Doğru.
Şimdi bu API'nin uygulanmasına gelelim.
Ben schema dot C dosyasındayım ve bu API'nin uygulaması olan schema get new schema for schema in.
Çok basit ve anlaşılırdır.
Doğru.
Benzer şekilde, izin sayacı değişkenine sadece sıfır değerini atadığınız şema yok etme işleminiz vardır.
Muteks için şemanın kilidini açarsınız ve ardından şemanın koşul değişkenini yok edersiniz ve ardından
semaforun muteksini yok edersiniz, değil mi?
Yani tüm bu API'ler oldukça basit ve anlaşılırdır.
Bunun için ne gerekiyor?
Biraz dikkat bu API'nin uygulanmasıdır, ağırlığıma bakın ve yazıma bakın ve size bu iki
API'nin nasıl uygulanacağını göstereceğim, değil mi?
Kuvvet uygulamamızı tamamladıktan sonra, standart API çağrılarını kendi semafor uygulamanızın
kendi özel API çağrılarıyla değiştirerek standart semaforları kullanarak daha önce yazdığınız katı
değişim programını yazmalısınız.
Doğru, böylece semaforunuzun da standart semafor kadar iyi çalıştığını doğrulayabilirsiniz.
Evet çocuklar, şimdi size API'nin uygulamasını göstereyim.
Bekle.
Doğru.
Yani bir iş parçacığı API'yi çağırdığında.
Bekle, semaforun sayacını azaltmamız gerektiğini zaten biliyoruz.
Ve bu sayaç değeri negatifse, iş parçacığımız engellenmelidir.
Değil mi?
Öncelikle, semafor üzerinde herhangi bir güncelleme yapmak için semaforu kilitlememiz gerekir,
değil mi?
Böylece biz semaforun durumunu güncellerken, süreçteki başka hiçbir iş parçacığı semaforun durumunu incelememeli
veya değiştirmemelidir.
Bu semafor üzerinde bir kilit alalım ve sonra semaforun izin sayacının değerini
düşüreceğiz.
Ve sonra bu semaforun izin sayacının sıfırdan küçük olup olmadığını kontrol edeceğiz, o zaman iş parçacığımızın bloke olması
gerekir.
Doğru.
Yani oldukça basit görünüyor.
Çağıran iş parçacığını bloke etmek için, semaforun muteksini kullanarak semaforun koşul değişkenini
bloke edeceğiz.
Doğru.
Dolayısıyla, bu p iş parçacığı koşulu bekleme çağrısı yürütülür yürütülmez, bu semafor muteksinin kilidi otomatik olarak açılacaktır.
Bu sizin de farkında olduğunuz bir şey, değil mi?
Hat numaralarını etkinleştirmeme izin verin ve şimdi ilerleyin.
Dolayısıyla, iş parçacığınız 49 numaralı satırda bloke olduğunda, sürecin başka bir iş parçacığı bir post çağrısı
yaptığında blokajı kaldırılacak ve 49 numaralı satırın ötesinde yürütülmeye devam edecektir.
Bu yüzden kısa süre içinde bir çağrı sonrası uygulayacağız.
Wait'in uygulamasını tamamlayalım, böylece iş parçacığı engellenmediğinde, mutex'in kilidini
açıkça açmalı ve işimiz bitmeli.
Bekleme API'sinin uygulanmasının oldukça basit ve anlaşılır olduğunu görebilirsiniz.
Sadece beş satırlık bir kod, değil mi?
Benzer şekilde, programımızda çalışan bazı iş parçacıkları tarafından çağrılacak olan post API'sinin uygulanması
söz konusu olduğunda.
Post API'nin mantığı, semaforun izin sayacı değerini artırmak ve artırmadan önce, semaforun izin sayacı değeri sıfırdan
küçükse, bir iş parçacığının o semafor üzerinde engellendiği anlamına gelir.
Doğru.
Ve eğer bir iş parçacığı bu semafor üzerinde bloke olmuşsa, o iş parçacığının blokesini kaldırmak için semaforun bu koşul değişkenine
bir sinyal göndermelisiniz.
Bu nedenle semafor API'si, izin sayacını artırarak semaforun durumunu değiştirmeyi de gerektirir.
Bu nedenle semafor hakkını kilitleyeceğiz ve izin sayacı değerini artırmadan önce izin sayacı değerinin sıfırdan
küçük olup olmadığını kaydedelim.
Doğru.
Ve sonra semaforun izin sayacını artıracağız.
Bu nedenle, semafor üzerinde post API'sini çağıran herhangi bir iş parçacığının semaforun izin sayacı değerini
artırması beklenir.
Semaforun izin sayacı değerini artırmadan önce, semaforun izin sayacı değerinin
sıfırdan küçük olup olmadığını zaten kaydetmiştik.
Doğru.
Dolayısıyla, semaforun izin sayacı değeri sıfırdan küçükse, semafor üzerinde engellenen bir iş parçacığı
olduğu anlamına gelir.
Şimdi bir sonraki adımımız bu semafora bir sinyal göndermek olmalı, değil mi?
Böylece, semaforu bekleyen herhangi bir iş parçacığı olup olmadığını kontrol edeceğimi, bu iş parçacığına
sinyal göndereceğimi ve böylece bu koşul değişkenine sadece bir sinyal göndereceğini görebilirsiniz.
Bu, işletim sisteminiz tarafından bu koşul değişkenini bekleyen tam olarak bir iş parçacığının çağrılacağı
anlamına gelir.
Doğru.
Elbette, işletim sisteminizin zamanlama politikasına göre bu koşul değişkenini
bekleyen birden fazla iş parçacığı varsa, iş parçacıklarından birinin seçileceği
ve ona CPU verileceği sizin elinizde değildir.
Doğru.
Ve son olarak, semaforun bu muteksinin kilidini açacağız ve bu Semafor API'sinin uygulanmasını
tamamlar.
Basit post API uygulamasının da oldukça basit olduğunu ve oldukça sezgisel olduğunu görebilirsiniz.
Semaforun nasıl çalıştığına ilişkin teori bölümünde tartıştıklarımız.
Bekle ve gör sonrası API'lerinde tam olarak aynı şeyi uyguluyoruz ve örneğin CMA Destroy, ardından CMA,
CMA, ET cetera için yeni CMA almak için CMA'nın geri kalan API'lerinin uygulanmasını tamamlamanızı
bekliyorum.
Değil mi?
Böylece, mini CMA dört kitaplığımız hazır.
CMA dot ve CMA dot C dosyanız hazır olmalıdır.
Ve şimdi standart CMA dört kullanarak zaten uyguladığınız bir problemi uygulamalısınız.
Tek fark, bu kez standart CMA düşüşlerini kullanmak yerine, lütfen özel CMA kuvvetinizi
kullanın ve burada çıktının aynı kaldığını görün.
Değil mi?
Tebrik ederim.
Artık kendi CMA gücünüzü uygulayabilirsiniz.