Tekrar hoş geldiniz çocuklar.
Şimdi, tartışacağımız bir sonraki sorun yemek filozofu sorunudur.
Bu sorunun ödevi bu dosyada mevcuttur, yani yemek felsefecileri C ödevi ve çözümü
zaten uygulanmış ve bu dosyada size sunulmuştur.
Bir kez daha, bir sorunu kendi başınıza çözme konusunda yeterince deneme yapmadan önce
çözüme bakmayı denemekten kaçınmanızı tavsiye ederim.
Şimdi bunu tartışacağız.
Yemek filozofu probleminin tam olarak ne olduğunu, problemi aşırı karmaşık hale getirmemek için
problem ifadesinde bazı küçük değişiklikler yapacağız.
Ayrıca yemek filozofu probleminin iş parçacığı senkronizasyonu dünyasında neden özel bir
problem olduğunu ve üretici tüketici probleminden sonra neden çok ilgi çektiğini tartışacağız.
Yani yemek filozofu problemi standart bir problemdir ve varyantları internette kolayca bulunabilir.
Şimdi problem cümlesini tartışalım.
Sağ taraftaki diyagramda da görebileceğiniz gibi, lezzetli bir pastamız var
ve şu anda bu pastanın etrafında oturan beş filozofumuz var, elinizde sadece beş
kaşık var ve bir filozof ancak hem sol hem de sağ tarafındaki kaşıklar mevcut olduğunda
pasta yiyebilir.
Doğru.
Yani sıfırıncı filozof ancak kaşık sıfır olduğunda ve her ikisi için de kaşık sıfırıncı filozof için mevcut olduğunda
pasta yiyebilir.
Ve aynı şey bu diyagramdaki her filozof için de geçerlidir.
Değil mi?
İşte problem cümlesinin kurgusu budur.
Ne kadar kaşık varsa o kadar da yemek filozofu vardır.
Değil mi?
Şimdi bu sorun bildiriminin şart ve koşullarının neler olduğunu tartışalım.
Yani filozof ancak iki kaşığa da erişimi olduğunda yemek yiyebilir.
Yani bu oldukça açık bir durum.
Bir filozofun iki kaşığa da erişimi olmadığı sürece pastayı yemesine izin verilmez.
Filozof önce sol kaşığa sonra da sağ kaşığa erişmeye çalışır.
Dolayısıyla bu, çözümümüzü tasarlarken ve uygularken uymamız veya saygı göstermemiz gereken kısıtlamalardan
biridir.
Örneğin, filozof sıfırın bir pasta yemek istediğini varsayalım, değil mi?
Yani filozof sıfıra göre, sol kaşık ESP sıfırdır ve sağ kaşık sağ için ESP'dir.
Bu yüzden Filozof sıfır önce sol kaşığına erişmek için bir talepte bulunacaktır.
Ve sıfırıncı filozof sol kaşığa erişim hakkı elde ettiğinde, sadece sıfırıncı filozofun sağ kaşık için erişim
hakkı talep etmesine izin verilir.
Doğru.
Bu, çözümünüzün uyması gereken kısıtlamadır.
Bu kısıtlama, bu problemdeki her filozof için geçerlidir.
Üç numaralı kısıtlama, sol kaşığa erişim sağlandıktan sonra sağ kaşık mevcut değilse
filozofun sol kaşığı da bırakması ve bir saniye bekledikten sonra baştan başlaması
gerektiğini söyler.
Doğru.
Bu diyagramda sıfırıncı filozofa sol kaşığa erişim hakkı verildiğini ve sıfırıncı filozofun
sağ kaşığa erişim hakkı için talepte bulunduğunu ve sağ kaşığın boş olmadığını çünkü dördüncü filozof
tarafından kullanıldığını varsayalım. Böyle bir durumda sıfırıncı filozof sol kaşığa erişim
hakkından da vazgeçecektir.
Değil mi?
Ve filozof sıfır, bir saniye dinlendikten sonra sol kaşığa erişmeye çalışacaktır.
Doğru.
Yani burada sıfır filozofunun sağ kaşığına erişememesi durumunda, zaten erişebildiği
sol kaşığından vazgeçmesi gerektiğini görebilirsiniz, değil mi?
O halde dördüncü kısıtlama, filozofun her iki kaşığa da eriştikten sonra bir saniye boyunca pastanın tadını
çıkaracağını söyler.
Doğru.
Yani bu basitçe şu anlama gelir: Eğer sıfırıncı filozof her iki kaşığa da erişebilirse, sıfırıncı filozofun bir
saniyeliğine pastaya erişmesine ve pastayı yemesine izin verilir.
Bu basitçe, filozof sıfırın kaşıklarından birini bir saniye bile bırakmayacağı anlamına
gelir.
Doğru.
Beş numaralı kısıtlama da bunu söylüyor.
Filozof bir saniye pastanın tadını çıkardıktan sonra iki kaşığı da bırakır.
Altı numaralı kısıtlama, filozofun bir saniye bekledikten sonra pastanın ikinci dilimi için girişimde
bulunacağını söyler.
Yani bu basitçe şu anlama gelmektedir: Filozof pastaya sıfır erişim sağladıktan ve pastayı bir saniyeliğine
yedikten sonra, filozof her iki kaşığı da serbest bırakır ve her iki kaşığa da birbiri ardına ikinci kez erişim
sağlamaya çalışır.
Bir saniye.
Doğru.
Bu da çözümümüzde uymamız gereken bir diğer kısıtlamadır.
Böylece filozof bir saniye boyunca pastanın tadını çıkarır ve bu bir saniyeden sonra filozof
iki kaşığından da vazgeçer ve iki kaşığından da vazgeçtikten sonra filozof ancak bir saniye sonra
kaşıklara erişim talep eder.
Şimdi bu problem cümlesinde filozoflar hiçbir şey değiller, ama tehditler ve kaşıklardan
başka bir şey olmayan kaynaklar için rekabet ediyorlar, değil mi?
Bunlar sol ve sağ kaşıklardır.
Tüm bu filozof tehditlerin sonsuz bir döngü içinde çalışacağı bir çözüm tasarlayacağız.
Doğru.
Ve çözümümüz, bitişik olmayan filozofların paralel olarak yemek yiyebilmelerini sağlamalıdır.
Değil mi?
Örneğin, filozof sıfır ve filozof iki aynı anda paralel olarak yemek yiyebilir çünkü sol ve sağ
kaşıkları üst üste binmez.
Benzer şekilde, filozof üç ve filozof sıfır paralel olarak yemek yiyebilir, değil mi?
Dikkat ederseniz, bu bir yemek filozofu problemidir ve şu anda belki de size aşırı karmaşık
görünmektedir.
Adım adım bir program tasarlayacağız.
Veri yapılarını tartışacağız.
Programımızı nasıl yapılandıracağımızı veya düzenleyeceğimizi tartışacağız ve daha sonra tüm
bu kısıtlamaları karşılayan adım adım çözümü tartışacağız.
Değil mi?
Eminim şu anda bu sorunu çözmeye nasıl başlayacağınız konusunda hiçbir fikriniz olmayabilir.
Bu yüzden benimle kalın çünkü iş parçacığı senkronizasyonu, daha önce de söylediğim gibi, bilgisayar bilimleri alanındaki
en zor konulardan biridir.
Matematikte olduğu gibi, bu beceride de ustalaşmak için çok ama çok pratik yapmak gerekir.
Gerçi şimdi, üretici tüketici sorunu o kadar da karmaşık bir sorun değildi.
Veri yapılarınızı, program yapılarınızı planlamadan ve bunun da ötesinde adım adım
çözümü uygulamadan yemek filozofu problemini çözemezsiniz.
Değil mi?
Orta derecede karmaşık iş parçacığı senkronizasyonuna dayalı programların da dikkatle tasarlanmış
veri yapıları ve program yapısı olmalıdır.
Bu nedenle, bu sorun bildirimini açıklayan sunum slaytları referansınız için kaynak bölümüne
eklenmiştir.
Şimdi bir sonraki ders videosunda, bu sorunun çözümünü tasarlamaya doğru ilerleyelim.