WEBVTT

00:06.900 --> 00:13.200
Şimdi çocuklar, her iki kaşığı serbest bırakmak için ikinci API akışlarını uygulayacağız ve bundan

00:13.200 --> 00:18.420
sonra son API filozofunu uygulayacağız, her iki kaşığa da erişeceğiz, değil mi?

00:18.600 --> 00:25.710
Yani ikinci API'de filozofun yapması gereken tek şey iki kaşığını da serbest bırakmaktır.

00:25.740 --> 00:29.490
Yani, her iki kaşığını da kullanılabilir olarak işaretlemelidir.

00:29.490 --> 00:30.240
Değil mi?

00:31.560 --> 00:37.620
Bu fonksiyon, bu fonksiyona argüman olarak aktarılan filozofun her iki kaşığa da zaten

00:37.620 --> 00:40.050
erişimi olduğunu varsayar.

00:40.050 --> 00:40.830
Doğru.

00:40.980 --> 00:45.690
Filozof kaşıkları serbest bırakıyor çünkü her iki kaşığa da erişimi var.

00:45.690 --> 00:46.290
Değil mi?

00:47.650 --> 00:51.570
Şimdi bu fonksiyonun uygulanmasıyla başlayalım.

00:51.580 --> 00:57.470
Öncelikle bu filozofun sol kaşığına ve sağ kaşığına işaret etmemiz gerekiyor.

00:57.490 --> 01:02.230
Bunun için halihazırda uyguladığımız bu yardımcı API'leri kullanabiliriz.

01:02.320 --> 01:09.160
Ş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

01:09.160 --> 01:15.250
ve artık filozof tarafından işgal edilmediğini yansıtacak şekilde değiştirmemiz gerekiyor.

01:15.460 --> 01:18.730
Bu da kaşığın durumunu değiştirmemiz gerektiği anlamına geliyor.

01:18.730 --> 01:23.500
Ve kaynağın durumunu değiştirmemiz gerektiğinde, kaynakları kilitlememiz gerekir.

01:23.510 --> 01:24.300
Değil mi?

01:24.310 --> 01:28.750
Böylece hem sol kaşığı hem de sağ kaşığı kilitlemiş olduk.

01:29.800 --> 01:37.960
Şimdi programımızda bazı sağlık kontrolleri yapalım, böylece hataları oluştukları anda yakalayabilelim.

01:37.990 --> 01:38.680
Doğru.

01:38.680 --> 01:40.120
Şunu bir kontrol edelim.

01:40.120 --> 01:44.540
Bu sol ve sağ yumurtalar bu filozof tarafından haklı olarak işgal edilmiştir.

01:44.560 --> 01:45.310
Doğru.

01:45.340 --> 01:50.560
Bunu, programa belirli assert ifadeleri ekleyerek yapabiliriz.

01:51.430 --> 01:57.370
Bu işlevin uygulanmasına, bu filozofun zaten kendisine tahsis edilmiş sol ve sağ yumurtaları

01:57.370 --> 02:00.900
olduğunu varsayarak başladığımızı unutmayın.

02:00.910 --> 02:01.710
Doğru.

02:01.720 --> 02:05.680
Yani bu atamaların programı çökertmemesi gerektiği anlamına gelir.

02:05.680 --> 02:08.620
Sol ve sağ spawn'ın durumu ayarlanmışsa.

02:08.620 --> 02:13.600
Bir bakıma bu filozof, sağ ve sol kaşığının gerçek sahibidir.

02:13.690 --> 02:14.470
Doğru.

02:15.460 --> 02:22.870
Programınız bu uyarılardan herhangi birinde çökerse, veri yapısı durumunuz hatalı demektir.

02:22.900 --> 02:23.710
Doğru.

02:23.860 --> 02:30.870
Şimdi, ileriye doğru, şimdi kaşıkları kullanılabilir olarak işaretleme zamanı, değil mi?

02:30.880 --> 02:37.390
O halde programın çıktısının bize neler olup bittiğini anlatması için bazı printf deyimleri ekleyelim.

02:37.480 --> 02:38.290
Doğru.

02:38.290 --> 02:48.220
Bu yüzden sol kaşığın filozofunu boş olarak işaretleyeceğim ve bu sol kaşığı kullanılmıyor olarak işaretleyeceğim.

02:48.220 --> 02:48.910
Doğru.

02:48.910 --> 02:54.190
Dolayısıyla 93 ve 94 numaralı satırlar sol kaşığın artık kullanılabilir olduğunu yansıtır.

02:54.190 --> 02:58.120
Sol kaşığı kullanan hiçbir filozof yoktur.

02:58.600 --> 03:05.890
Ve şimdi, sol kaşığın durumunu değiştirmekle işim bittiğine göre, filozofumuzun solunda

03:05.890 --> 03:12.940
oturan filozofun bu sol kaşığa erişim izni vermek için bekliyor olması mümkündür.

03:12.970 --> 03:13.810
Doğru.

03:14.080 --> 03:22.850
Dolayısıyla şu anki filozofumuz için, az önce serbest bıraktığı sol kaşığın durum değişkeniyle ilgili

03:22.850 --> 03:25.640
bir sinyal gönderme zamanıdır.

03:25.670 --> 03:26.480
Doğru.

03:26.960 --> 03:34.730
Bu sinyal, bu sol kaşıkta bir erişim bekleyen bir filozof tarafından alınacaktır.

03:34.730 --> 03:35.420
Doğru.

03:35.420 --> 03:41.630
Bu, şu anki filozofumuzun hemen solunda oturan filozoftur.

03:41.630 --> 03:48.830
Ve şimdi sol kaşığın durumunu değiştirmeyi ve sinyal göndermeyi tamamladığımıza göre, şimdi sol

03:48.830 --> 03:51.710
kaşığın muteks kilidini açabiliriz.

03:51.890 --> 03:52.730
Değil mi?

03:52.730 --> 04:00.650
Burada dikkat edebileceğiniz bir husus, filozofumuzun bu noktada bir üretici olarak hareket ettiği, filozof ipliğimizin

04:00.650 --> 04:07.970
ise kaşıkları kullanılabilir hale getirdiği için bir üretici olarak hareket ettiğidir.

04:08.000 --> 04:11.180
Kaşıklar bir şey değil, ama onlar kaynak, değil mi?

04:11.180 --> 04:15.290
Dolayısıyla, kaynak üreten tüm iş parçacıkları üretici iş parçacıklarıdır.

04:15.320 --> 04:21.890
Şimdi koşul değişkenlerini tartışırken, tipik bir üretici iş parçacığının

04:21.890 --> 04:27.500
adımlarını tartıştık, yani burada Adım S6, S7, S8 ve S9.

04:27.500 --> 04:31.970
Ayrıca, bu adımları S6'dan S9'a eşleyebilirsiniz.

04:32.420 --> 04:35.570
S6, bir kaynağın muteksinin kilitlenmesi anlamına gelir.

04:35.570 --> 04:38.990
Yani 81 numaralı satır adım numarasıdır.

04:38.990 --> 04:41.540
Sol kaşık sağ için S6.

04:42.350 --> 04:50.450
Ardından S7 numaralı adım İş parçacığının bir sinyal göndermesi gerekip gerekmediğine karar vermesi için kaynağın durumunu

04:50.450 --> 04:51.820
kontrol edin.

04:51.830 --> 04:59.660
Yani burada, S7 adımı sol veya sağ kaşığın durumunun doğru olup olmadığını doğrulamaya

04:59.660 --> 05:01.220
eşdeğerdir.

05:01.820 --> 05:07.130
Ve sonra üretici iş parçacığının kuyruktaki öğeyi bir enqueue ürettiğini görebilirsiniz.

05:07.160 --> 05:14.690
Yani bu, bu uygulamada kaynak üretmeye benzer, filozofumuzun kaşıkları kullanılabilir

05:14.690 --> 05:19.640
hale getirerek kaynak ürettiğini görebilirsiniz.

05:19.640 --> 05:20.390
Değil mi?

05:21.480 --> 05:26.080
Sekiz numaralı adımda üretici iş parçacığının bir sinyal gönderdiğini görebilirsiniz.

05:26.100 --> 05:31.860
Burada da filozof ipliğimizin artık sol kaşığın koşul değişkenine bir sinyal gönderdiğini

05:31.860 --> 05:33.030
görebilirsiniz.

05:33.210 --> 05:34.030
Doğru.

05:34.050 --> 05:38.940
Ve son olarak, filozof iş parçacığımız bir sol kaşığın muteksinin kilidini açar.

05:38.970 --> 05:41.500
Bu dokuz numaralı adımla aynıdır.

05:41.580 --> 05:48.030
Yani burada anlatmaya çalıştığım şey, bu bir yemek filozofu problemi olsa da, üretici ve tüketici ipliklerinin

05:48.030 --> 05:52.080
aynı adımlarını tekrarlamak zorunda kalacağınızdır.

05:52.080 --> 05:52.920
Değil mi?

05:53.620 --> 06:01.290
Herhangi bir tipik iş parçacığı senkronizasyon problemi her zaman standart bir üretici ve tüketici iş parçacığı problemine

06:01.290 --> 06:02.690
indirgenebilir.

06:02.700 --> 06:03.420
Değil mi?

06:03.420 --> 06:05.970
İşte burada tanık olduğumuz şey de budur.

06:06.820 --> 06:11.080
Şimdi ileriye doğru giderken, sol kaşığın tüm adımlarını tamamladık.

06:11.080 --> 06:14.300
Doğru kaşık için de aynı adımları atmalıyız.

06:14.320 --> 06:15.100
Doğru.

06:15.100 --> 06:21.220
Böylece filozof iş parçacığımız bazı bilgiler yazdıracak ve sağ kaşığı kullanılabilir

06:21.220 --> 06:27.370
olarak işaretleyecek ve ardından sağ kaşığın koşul değişkenine sinyal gönderecek, böylece

06:27.370 --> 06:33.880
mevcut filozofumuzun sağ tarafında oturan filozof doğru bir sinyal alacaktır.

06:33.880 --> 06:40.660
Ve o filozof bir sinyal aldığında, o filozof uyanacak ve sağ kaşıkta bir eksen yakalamaya

06:40.660 --> 06:41.980
çalışacaktır.

06:42.010 --> 06:42.820
Değil mi?

06:43.180 --> 06:48.670
Ve son olarak filozofumuz sağ kaşıktaki muteksin kilidini de açacaktır.

06:48.670 --> 06:52.120
Bu da bu işlevin uygulanmasını tamamlar.

06:54.210 --> 06:54.870
Doğru.

06:55.080 --> 06:59.130
Yani filozof sürümünü hem Spoon API hem de bu şekilde uygulayabiliriz.

07:00.270 --> 07:05.850
Şimdi filozofun her iki kaşığa da erişmesi uygulamasını tartışacağız.

07:05.880 --> 07:12.570
Bu API'nin uygulaması biraz uzundur ve yemek filozofu problemini çözmenin arkasındaki temel

07:12.570 --> 07:15.690
mantık bu özel API'de uygulanmaktadır.

07:15.720 --> 07:16.530
Doğru.

07:16.860 --> 07:21.120
Bu yüzden bir sonraki ders videosunda bu API'nin uygulanmasını tartışacağız.
