Evet arkadaşlar, şimdi semaforların kullanımını gösteren çok basit bir örnek yazalım.
Bu örnekte, beş iş parçacığı oluşturacağız ve semafor kullanarak bu beş iş parçacığından yalnızca iki iş parçacığının
kritik bölüm içinde çalışmasını kısıtlamamız gerekiyor.
Doğru.
Geri kalan üç iş parçacığı kritik bölümün dışında beklemeli ve kritik bölüme sadece ve sadece
kritik bölümün içinde çalışan iş parçacığı kritik bölümü gerçekten terk ettiğinde girmelidir.
Doğru.
Bu basit örnekte, kritik bölüm içinde çalışan iş parçacığı tarafından basitçe bazı
mesajlar yazdırarak kritik bölüm kodunu taklit edeceğiz.
Bu, başvurabileceğiniz kaynak dosyadır ve tartışacağımız da bu kaynak dosyadır.
Değil mi?
Yani sorun ifadesi çok basit.
Beş iş parçacığımız olacak ve herhangi bir zamanda kritik bölümde yalnızca iki iş parçacığının çalışmasına izin
vermemiz gerekiyor.
Ekranda, dizin multithreading slash semaforunun içinde olduğumu görebilirsiniz.
Ve bu da uygulayacağımız dosya, değil mi?
Bu, semaforların kullanımını gösteren çok basit bir örnektir.
Bu örnekte bazı ham kodlar yazdım ve bu kodu geliştireceğiz, böylece bir ana fonksiyonumuz olduğunu
görebilirsiniz ve beş iş parçacığı oluşturmamız gerektiğinden, bu nedenle beş iş parçacığı tutamacı
aldım ve bu beş iş parçacığı tutamacını kullanarak beş iş parçacığı oluşturacağım veya başlatacağım.
Doğru.
Bu yüzden beş iş parçacığı oluşturmak için ortak bir iş parçacığı alt çizgi oluşturma kullanıyorum ve iş parçacıkları çok
basit bir işlev olan iş parçacığı işlevine bağlı.
Ve bu işlev basitçe iş parçacığının beş saniye boyunca bir for döngüsünde çalışmasını sağlar.
Doğru.
İşte.
Uyku 1'i kullandığımı görebilirsiniz.
Ayrıca, bu iş parçacığı işlevine aktarılan argüman hiçbir şey değildir, ancak hangi iş parçacığının yürütüldüğünü
tanımlamak için yalnızca bir dizedir.
Doğru.
Beş iş parçacığının tümü bu iş parçacığı işlevi içinde yürütüleceğinden, bu for döngüsü içinde
tam olarak hangi iş parçacığının yürütüldüğünü belirlemek için bu iş parçacığı adını kullanabiliriz.
Yani bu programı derleyip çalıştırırsanız, çıktıyı görürsünüz.
Bunun gibi bir şey.
Yani, beş iş parçacığının tamamı for döngüsü içinde çalışacaktır.
Bu örnekte, bu for döngüsünü kritik bölüm kodu olarak değerlendirdik.
Değil mi?
Yani bu sadece kritik bölümün bir simülasyonudur.
Bu gerçekten kritik bir bölüm değildir çünkü iş parçacıkları arasında paylaşılan herhangi bir veri yapımız
yoktur.
Ancak bizim odak noktamız, kritik bölüm içinde çalışan iş parçacıklarının sayısını sınırlamak için semaforların nasıl kullanılacağıdır.
Yani aslında hangi kritik bölüm kodu olduğu önemli değildir.
Önemli olan, kritik bölüm içinde çalışacak iş parçacığı sayısının nasıl sınırlandırılacağıdır.
Yani şu andan itibaren bu programda semafor yok.
Bu nedenle, beş iş parçacığının tümü bu for döngüsünü yürütecektir.
Değil mi?
Şimdi semaforları kullanalım ve bir seferde sadece iki iş parçacığının bu kritik bölüme girmesine nasıl izin verebileceğimizi
görelim.
Bu yüzden yapacağım ilk şey semaphore dot h başlık dosyasını dahil etmek olacaktır.
Şimdi bu örnek bizi semafor API'lerine de aşina kılıyor.
Böylece semaphore dot h başlık dosyasını ekledikten sonra, artık semaphore nesnesini tanımlayabilirim.
Değil mi?
Böylece bu veri tipi kullanılarak semafor nesnesi oluşturulabilir.
Sam, T'nin altını çiz.
Bu, semafor değişkenlerini bildirmek için bize sağlanan Posix veri yapılarıdır.
Doğru.
Bu yüzden M olarak bir semafor aldık ya da şimdi buna Sam ya da Semafor diyelim çünkü kritik bölüme aynı anda sadece iki
iş parçacığının girmesine izin vermemiz gerekiyor.
Bu nedenle, izin sayısı değeri iki olarak tanımlanmıştır Şu anda ana işlevde yapacağım
ilk şey semaforu başlatmaktır.
Semaforu başlatmak için bir API Sam underscore'umuz var ve üç argüman kabul ediyor.
İlk bağımsız değişken, başlatmakta olduğunuz semafora bir işaretçidir.
İkinci argümanı her zaman sıfır olarak geçebilirsiniz.
Bu ikinci argümana daha sonra tekrar döneceğiz.
Üçüncü bağımsız değişken ise semaforu başlatmak istediğiniz ilk değerdir.
Burada semaforu iki değeriyle başlatıyoruz, değil mi?
Yani bu, semaforumuzun iki iş parçacığının kritik bölüme girmesine izin vereceği anlamına gelir, değil mi?
Ve tüm iş parçacıkları kritik bölümü yürütmeyi bitirip ana iş parçacığına katıldığında,
programdan çıkmadan önce semaforu gerçekten yok edebilirsiniz.
Değil mi?
Bunun için API kullanabilirsiniz.
Sam yok etmenin altını çiziyor.
Şimdi semaforun başlatılması ve yok edilmesi tamamlanmıştır.
Şimdi iş parçacığı işlevi geri çağrısı olan bu işleve odaklanalım.
Bu kritik bölümü öyle bir şekilde korumalıyız ki, bu kritik bölüm içinde eşzamanlı olarak yalnızca iki iş parçacığı
çalışabilsin.
Doğru.
Başlangıç olarak, kritik bölümün başlangıcında, yani kritik bölümün giriş noktasında,
Sima four'u kullanmamız gerekir, öyle ki Sima four kritik bölümün içine yalnızca iki iş parçacığının girmesine
izin verir.
Doğru.
Bunun için bize bir API verildi.
Sam ağırlığın altını çiziyor, doğru.
Ve Sima four'un işaretçisini bu API'ye aktarmamız gerekiyor.
Dolayısıyla iş parçacığı bu API'yi çalıştırır çalıştırmaz Sima four'un değeri bir azaltılır.
Doğru.
Ve iş parçacığının bu Sam ağırlık API'sini atlamasına izin verilirse, iş parçacığı kritik bölüme girmiş
demektir.
Bu yüzden Sam weight çağrısını çağırmadan önce bir iş parçacığının kritik bölüme girdiğine dair bir mesaj yazdırabilir
ve iş parçacığı adını yazdırabiliriz.
Ve bundan sonra iş parçacığı bir API sam ağırlığını çağırır ve semafor sayaç değerine bağlı
olarak iş parçacığı ya engellenir ya da bu çağrının ötesine geçer.
Doğru.
İş parçacığı bu çağrının ötesine geçtiyse, iş parçacığı kritik bölüme girmiş demektir.
Doğru.
Dolayısıyla iş parçacığımız bu kritik bölümün içinde beş saniye boyunca çalışacaktır.
Ve iş parçacığımız kritik bölümün yürütülmesini tamamladığında.
Daha sonra iş parçacığımızın kritik bölümden çıkmadan önce kullanıcıya kritik bölümden çıktığını
bildirmek için mesaj yazdırma zamanıdır.
İş parçacığımız semafor sayacının değerini artırmalı ve aynı bekleme çağrısı üzerinde bekleyen herhangi bir iş parçacığına
sinyal göndermelidir.
Doğru.
Bu nedenle, iş parçacığımız bir API sam gönderisinden yararlanır.
Sam post, p iplik durumu sinyaline benzer.
Doğru.
Ve iş parçacığı kritik bölümden tamamen çıktıktan sonra, iş parçacığının kritik bölümden başarıyla
çıktığını belirten son bir mesaj yazdırabiliriz.
Doğru.
Bu da bir sorun bildiriminin uygulanmasını tamamlar.
Böylece, CMA kullanarak kritik bölüm içinde eşzamanlı olarak yürütülecek iş parçacığı sayısını ne kadar kolay kontrol edebileceğimizi
görebilirsiniz.
Doğru.
Tek yapmanız gereken kritik bölümü Sam Wait ve Sam post API'leri arasına sıkıştırmaktır.
Doğru.
Sam wait API'si, azaltma işleminden sonra semaforun değeri negatif olursa iş parçacığını engelleyecektir.
Aksi takdirde semaforun değerini düşürür ve iş parçacığının sam wait çağrısını atlamasına izin verir.
Doğru.
Sam post API ise tam tersini yapıyor.
Semaforun değerini artırır ve aynı bekleme çağrısında potansiyel olarak bekleyebilecek veya bloke olabilecek herhangi bir
iş parçacığına sinyal gönderir.
Doğru.
Şimdi bu programı derleyip çalıştırdığınızda, herhangi bir zamanda kritik bölümde yalnızca iki iş parçacığının
çalıştığını göreceksiniz.
Değil mi?
Bu yüzden kararı size bırakıyorum çünkü bu örnek çok basit bir örnek.
Ve bu printf ifadelerinden, herhangi bir zamanda yalnızca iki iş parçacığının kritik bölümde çalışıyor
olması gerektiğini, diğer iş parçacıklarının ise ya kritik bölümden çoktan çıkmış ya da kritik
bölümün giriş noktasında bekliyor olmaları gerektiğini çok iyi anlayabilirsiniz.
Doğru.