Şimdi çocuklar, her iki kaşığı serbest bırakmak için ikinci API akışlarını uygulayacağız ve bundan
sonra son API filozofunu uygulayacağız, her iki kaşığa da erişeceğiz, değil mi?
Yani ikinci API'de filozofun yapması gereken tek şey iki kaşığını da serbest bırakmaktır.
Yani, her iki kaşığını da kullanılabilir olarak işaretlemelidir.
Değil mi?
Bu fonksiyon, bu fonksiyona argüman olarak aktarılan filozofun her iki kaşığa da zaten
erişimi olduğunu varsayar.
Doğru.
Filozof kaşıkları serbest bırakıyor çünkü her iki kaşığa da erişimi var.
Değil mi?
Şimdi bu fonksiyonun uygulanmasıyla başlayalım.
Öncelikle bu filozofun sol kaşığına ve sağ kaşığına işaret etmemiz gerekiyor.
Bunun için halihazırda uyguladığımız bu yardımcı API'leri kullanabiliriz.
Şimdi bir sonraki adımda, bu sol kaşık ve sağ kaşığın durumunu, bu sol ve sağ kaşıkların artık mevcut olduğunu
ve artık filozof tarafından işgal edilmediğini yansıtacak şekilde değiştirmemiz gerekiyor.
Bu da kaşığın durumunu değiştirmemiz gerektiği anlamına geliyor.
Ve kaynağın durumunu değiştirmemiz gerektiğinde, kaynakları kilitlememiz gerekir.
Değil mi?
Böylece hem sol kaşığı hem de sağ kaşığı kilitlemiş olduk.
Şimdi programımızda bazı sağlık kontrolleri yapalım, böylece hataları oluştukları anda yakalayabilelim.
Doğru.
Şunu bir kontrol edelim.
Bu sol ve sağ yumurtalar bu filozof tarafından haklı olarak işgal edilmiştir.
Doğru.
Bunu, programa belirli assert ifadeleri ekleyerek yapabiliriz.
Bu işlevin uygulanmasına, bu filozofun zaten kendisine tahsis edilmiş sol ve sağ yumurtaları
olduğunu varsayarak başladığımızı unutmayın.
Doğru.
Yani bu atamaların programı çökertmemesi gerektiği anlamına gelir.
Sol ve sağ spawn'ın durumu ayarlanmışsa.
Bir bakıma bu filozof, sağ ve sol kaşığının gerçek sahibidir.
Doğru.
Programınız bu uyarılardan herhangi birinde çökerse, veri yapısı durumunuz hatalı demektir.
Doğru.
Şimdi, ileriye doğru, şimdi kaşıkları kullanılabilir olarak işaretleme zamanı, değil mi?
O halde programın çıktısının bize neler olup bittiğini anlatması için bazı printf deyimleri ekleyelim.
Doğru.
Bu yüzden sol kaşığın filozofunu boş olarak işaretleyeceğim ve bu sol kaşığı kullanılmıyor olarak işaretleyeceğim.
Doğru.
Dolayısıyla 93 ve 94 numaralı satırlar sol kaşığın artık kullanılabilir olduğunu yansıtır.
Sol kaşığı kullanan hiçbir filozof yoktur.
Ve şimdi, sol kaşığın durumunu değiştirmekle işim bittiğine göre, filozofumuzun solunda
oturan filozofun bu sol kaşığa erişim izni vermek için bekliyor olması mümkündür.
Doğru.
Dolayısıyla şu anki filozofumuz için, az önce serbest bıraktığı sol kaşığın durum değişkeniyle ilgili
bir sinyal gönderme zamanıdır.
Doğru.
Bu sinyal, bu sol kaşıkta bir erişim bekleyen bir filozof tarafından alınacaktır.
Doğru.
Bu, şu anki filozofumuzun hemen solunda oturan filozoftur.
Ve şimdi sol kaşığın durumunu değiştirmeyi ve sinyal göndermeyi tamamladığımıza göre, şimdi sol
kaşığın muteks kilidini açabiliriz.
Değil mi?
Burada dikkat edebileceğiniz bir husus, filozofumuzun bu noktada bir üretici olarak hareket ettiği, filozof ipliğimizin
ise kaşıkları kullanılabilir hale getirdiği için bir üretici olarak hareket ettiğidir.
Kaşıklar bir şey değil, ama onlar kaynak, değil mi?
Dolayısıyla, kaynak üreten tüm iş parçacıkları üretici iş parçacıklarıdır.
Şimdi koşul değişkenlerini tartışırken, tipik bir üretici iş parçacığının
adımlarını tartıştık, yani burada Adım S6, S7, S8 ve S9.
Ayrıca, bu adımları S6'dan S9'a eşleyebilirsiniz.
S6, bir kaynağın muteksinin kilitlenmesi anlamına gelir.
Yani 81 numaralı satır adım numarasıdır.
Sol kaşık sağ için S6.
Ardından S7 numaralı adım İş parçacığının bir sinyal göndermesi gerekip gerekmediğine karar vermesi için kaynağın durumunu
kontrol edin.
Yani burada, S7 adımı sol veya sağ kaşığın durumunun doğru olup olmadığını doğrulamaya
eşdeğerdir.
Ve sonra üretici iş parçacığının kuyruktaki öğeyi bir enqueue ürettiğini görebilirsiniz.
Yani bu, bu uygulamada kaynak üretmeye benzer, filozofumuzun kaşıkları kullanılabilir
hale getirerek kaynak ürettiğini görebilirsiniz.
Değil mi?
Sekiz numaralı adımda üretici iş parçacığının bir sinyal gönderdiğini görebilirsiniz.
Burada da filozof ipliğimizin artık sol kaşığın koşul değişkenine bir sinyal gönderdiğini
görebilirsiniz.
Doğru.
Ve son olarak, filozof iş parçacığımız bir sol kaşığın muteksinin kilidini açar.
Bu dokuz numaralı adımla aynıdır.
Yani burada anlatmaya çalıştığım şey, bu bir yemek filozofu problemi olsa da, üretici ve tüketici ipliklerinin
aynı adımlarını tekrarlamak zorunda kalacağınızdır.
Değil mi?
Herhangi bir tipik iş parçacığı senkronizasyon problemi her zaman standart bir üretici ve tüketici iş parçacığı problemine
indirgenebilir.
Değil mi?
İşte burada tanık olduğumuz şey de budur.
Şimdi ileriye doğru giderken, sol kaşığın tüm adımlarını tamamladık.
Doğru kaşık için de aynı adımları atmalıyız.
Doğru.
Böylece filozof iş parçacığımız bazı bilgiler yazdıracak ve sağ kaşığı kullanılabilir
olarak işaretleyecek ve ardından sağ kaşığın koşul değişkenine sinyal gönderecek, böylece
mevcut filozofumuzun sağ tarafında oturan filozof doğru bir sinyal alacaktır.
Ve o filozof bir sinyal aldığında, o filozof uyanacak ve sağ kaşıkta bir eksen yakalamaya
çalışacaktır.
Değil mi?
Ve son olarak filozofumuz sağ kaşıktaki muteksin kilidini de açacaktır.
Bu da bu işlevin uygulanmasını tamamlar.
Doğru.
Yani filozof sürümünü hem Spoon API hem de bu şekilde uygulayabiliriz.
Şimdi filozofun her iki kaşığa da erişmesi uygulamasını tartışacağız.
Bu API'nin uygulaması biraz uzundur ve yemek filozofu problemini çözmenin arkasındaki temel
mantık bu özel API'de uygulanmaktadır.
Doğru.
Bu yüzden bir sonraki ders videosunda bu API'nin uygulanmasını tartışacağız.