WEBVTT

00:04.830 --> 00:06.120
Tekrar hoş geldiniz çocuklar.

00:06.120 --> 00:11.850
Şimdi, bu ders videosunda, sadece muteksler ve koşul değişkenleri kullanarak kendi semaforlarınızı nasıl

00:11.850 --> 00:13.950
uygulayabileceğinizi tartışacağım.

00:13.950 --> 00:17.820
Zaten bir program yazdık ve dahili semaforları kullandık.

00:17.820 --> 00:18.390
Doğru.

00:18.480 --> 00:24.240
Posix kütüphanesi tarafından sağlanan standart semaforları kullanarak zaten sıkı bir değişim

00:24.240 --> 00:25.590
programı yazdık.

00:25.830 --> 00:32.250
Şimdi kendi semaforlarımızı uygulamak iyi bir alıştırma olacaktır, böylece muteks ve koşul değişkenlerini

00:32.250 --> 00:38.400
kullanarak kendi semaforlarımızı nasıl uygulayacağımız konusunda pratik yapabiliriz, böylece gelecekte

00:38.400 --> 00:43.950
daha gelişmiş semaforlar uygulamamız gerekirse bunu yapabiliriz, değil mi?

00:44.980 --> 00:51.640
Yani bir semaforu temsil eden bir yapı tanımlayacaktık ve aslında semaforlar üzerinde gerçekleştirilecek

00:51.640 --> 00:56.800
işlemleri temsil eden bir API tanımlayacaktık.

00:56.980 --> 00:57.730
Doğru.

00:57.730 --> 01:03.940
Sol taraftaki yapının üç üye içeren bir semafor yapısını temsil ettiğini görebilirsiniz.

01:03.970 --> 01:05.200
İzin sayacı.

01:05.200 --> 01:10.990
Semaforun tüm işlevselliğinin bir izin sayacı tamsayı değişkeninin korunmasına bağlı olduğunu

01:10.990 --> 01:12.040
zaten biliyoruz.

01:12.070 --> 01:12.820
Değil mi?

01:12.940 --> 01:20.260
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

01:20.260 --> 01:24.490
özel bir şekilde güncellemek için kilitlenecek ve kilidi açılacaktır.

01:24.670 --> 01:31.230
Bir iş parçacığının semafor üzerinde beklemesi veya bloke olması gerektiğinde sağ ve koşul değişkeni kullanılacaktır.

01:31.240 --> 01:31.870
Doğru.

01:31.900 --> 01:34.090
Bunun için koşul değişkeni kullanırız.

01:34.360 --> 01:38.740
Sağ taraftaki API'ler semafor üzerinde gerçekleştirilecek işlemleri temsil eder.

01:39.340 --> 01:44.800
Ve bu API'lerin prototipi veya imzası standart olanlarla neredeyse aynıdır.

01:44.980 --> 01:51.010
Bu API'lerin imzasını standart API'lerle aynı tutmak için elimden geleni yaptım.

01:51.010 --> 01:57.840
Örneğin, standart API aynı ağırlığı kullandığımızı görebilirsiniz, ancak burada sigma alt çizgi ağırlığını

01:57.880 --> 01:59.460
kullanacağız, değil mi?

01:59.470 --> 02:04.300
Benzer şekilde, aynı yazı yerine Sigma yazısını kullanacağız, değil mi?

02:04.540 --> 02:11.080
Bu yüzden kendi semaforumuzu bu yolda bulunan dot h ve sigma dot c dosyasında uygulayacağız.

02:11.110 --> 02:13.900
Multithreading Bible slash semaforları.

02:13.930 --> 02:14.650
Doğru.

02:15.160 --> 02:19.960
Şimdi başlamak için, size sigma nokta H olan başlık dosyasını göstereyim.

02:19.960 --> 02:26.710
Şimdi sigma dot h dosyasındayım ve semaforu temsil eden veri yapılarını tanımladığımı ve semaforumuz

02:26.710 --> 02:32.110
üzerindeki işlemleri temsil eden tüm API'leri bildirdiğimi görebilirsiniz.

02:32.350 --> 02:39.320
Bu yüzden API'yi, ağırlığı, gönderiyi uygulamanız, yok etmeniz ve değeri doğru almanız gerekir.

02:39.320 --> 02:44.780
Bunlar genellikle semaforlar üzerinde işlem yapmak için kullandığımız API'lerdir.

02:44.810 --> 02:51.710
Şu anda, internette gezinirseniz veya internette bulunan bazı referanslara başvurursanız, semafor üzerindeki

02:51.710 --> 02:58.340
ağırlık ve post işlemlerinin de P ve V konvansiyonları kullanılarak temsil edildiğini görürsünüz; burada

02:58.340 --> 03:03.560
P semafor üzerindeki bir ağırlık işlemini temsil ederken, V semaforun post işlemini

03:03.560 --> 03:04.910
temsil eder.

03:05.300 --> 03:11.420
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.

03:11.420 --> 03:17.900
Bu nedenle, farklı etiketlere veya farklı referanslara başvurursanız, semafor üzerindeki ağırlık ve post işlemlerinin P veya

03:17.900 --> 03:24.290
V ile temsil edilebileceğini veya rekabetçi sınavlarda yukarı ve aşağı kullanımının kurulabileceğini görebilirsiniz.

03:24.290 --> 03:29.390
P ve V'yi ağırlık ve postaya kıyasla daha yaygın olarak bulabilirsiniz.

03:29.390 --> 03:30.080
Doğru.

03:30.080 --> 03:36.320
İşte bu yüzden ağırlık ve postaya kadar genişleyen kısa bir makro oluşturdum.

03:36.320 --> 03:36.950
Doğru.

03:39.520 --> 03:41.810
Şimdi bu API'nin uygulanmasına gelelim.

03:41.860 --> 03:51.160
Ben schema dot C dosyasındayım ve bu API'nin uygulaması olan schema get new schema for schema in.

03:51.160 --> 03:54.160
Çok basit ve anlaşılırdır.

03:54.280 --> 03:54.940
Doğru.

03:54.940 --> 04:01.600
Benzer şekilde, izin sayacı değişkenine sadece sıfır değerini atadığınız şema yok etme işleminiz vardır.

04:01.600 --> 04:07.420
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

04:07.420 --> 04:10.360
semaforun muteksini yok edersiniz, değil mi?

04:10.690 --> 04:14.320
Yani tüm bu API'ler oldukça basit ve anlaşılırdır.

04:14.320 --> 04:15.670
Bunun için ne gerekiyor?

04:15.670 --> 04:21.220
Biraz dikkat bu API'nin uygulanmasıdır, ağırlığıma bakın ve yazıma bakın ve size bu iki

04:21.220 --> 04:24.760
API'nin nasıl uygulanacağını göstereceğim, değil mi?

04:27.610 --> 04:33.550
Kuvvet uygulamamızı tamamladıktan sonra, standart API çağrılarını kendi semafor uygulamanızın

04:33.550 --> 04:39.940
kendi özel API çağrılarıyla değiştirerek standart semaforları kullanarak daha önce yazdığınız katı

04:39.940 --> 04:42.910
değişim programını yazmalısınız.

04:42.940 --> 04:49.450
Doğru, böylece semaforunuzun da standart semafor kadar iyi çalıştığını doğrulayabilirsiniz.

04:53.940 --> 04:57.150
Evet çocuklar, şimdi size API'nin uygulamasını göstereyim.

04:57.560 --> 04:58.100
Bekle.

04:58.110 --> 04:58.850
Doğru.

04:58.860 --> 05:01.180
Yani bir iş parçacığı API'yi çağırdığında.

05:01.650 --> 05:05.520
Bekle, semaforun sayacını azaltmamız gerektiğini zaten biliyoruz.

05:05.580 --> 05:09.930
Ve bu sayaç değeri negatifse, iş parçacığımız engellenmelidir.

05:09.960 --> 05:10.690
Değil mi?

05:10.740 --> 05:16.800
Öncelikle, semafor üzerinde herhangi bir güncelleme yapmak için semaforu kilitlememiz gerekir,

05:16.830 --> 05:17.430
değil mi?

05:17.430 --> 05:24.630
Böylece biz semaforun durumunu güncellerken, süreçteki başka hiçbir iş parçacığı semaforun durumunu incelememeli

05:24.630 --> 05:26.530
veya değiştirmemelidir.

05:26.550 --> 05:31.800
Bu semafor üzerinde bir kilit alalım ve sonra semaforun izin sayacının değerini

05:31.800 --> 05:32.850
düşüreceğiz.

05:32.850 --> 05:38.790
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ı

05:38.790 --> 05:39.480
gerekir.

05:39.510 --> 05:40.290
Doğru.

05:40.290 --> 05:42.570
Yani oldukça basit görünüyor.

05:42.900 --> 05:48.630
Çağıran iş parçacığını bloke etmek için, semaforun muteksini kullanarak semaforun koşul değişkenini

05:48.630 --> 05:50.090
bloke edeceğiz.

05:50.100 --> 05:50.930
Doğru.

05:50.940 --> 06:01.810
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.

06:01.810 --> 06:04.900
Bu sizin de farkında olduğunuz bir şey, değil mi?

06:06.190 --> 06:10.060
Hat numaralarını etkinleştirmeme izin verin ve şimdi ilerleyin.

06:10.610 --> 06:17.150
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ı

06:17.150 --> 06:23.180
yaptığında blokajı kaldırılacak ve 49 numaralı satırın ötesinde yürütülmeye devam edecektir.

06:23.300 --> 06:26.150
Bu yüzden kısa süre içinde bir çağrı sonrası uygulayacağız.

06:26.150 --> 06:32.540
Wait'in uygulamasını tamamlayalım, böylece iş parçacığı engellenmediğinde, mutex'in kilidini

06:32.570 --> 06:35.390
açıkça açmalı ve işimiz bitmeli.

06:36.050 --> 06:41.330
Bekleme API'sinin uygulanmasının oldukça basit ve anlaşılır olduğunu görebilirsiniz.

06:41.330 --> 06:44.070
Sadece beş satırlık bir kod, değil mi?

06:44.120 --> 06:51.530
Benzer şekilde, programımızda çalışan bazı iş parçacıkları tarafından çağrılacak olan post API'sinin uygulanması

06:51.530 --> 06:53.270
söz konusu olduğunda.

06:53.570 --> 07:04.580
Post API'nin mantığı, semaforun izin sayacı değerini artırmak ve artırmadan önce, semaforun izin sayacı değeri sıfırdan

07:04.580 --> 07:12.240
küçükse, bir iş parçacığının o semafor üzerinde engellendiği anlamına gelir.

07:12.270 --> 07:12.930
Doğru.

07:13.050 --> 07:20.160
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

07:20.160 --> 07:22.590
bir sinyal göndermelisiniz.

07:22.860 --> 07:29.700
Bu nedenle semafor API'si, izin sayacını artırarak semaforun durumunu değiştirmeyi de gerektirir.

07:29.730 --> 07:37.410
Bu nedenle semafor hakkını kilitleyeceğiz ve izin sayacı değerini artırmadan önce izin sayacı değerinin sıfırdan

07:37.410 --> 07:40.500
küçük olup olmadığını kaydedelim.

07:40.680 --> 07:41.490
Doğru.

07:41.970 --> 07:45.270
Ve sonra semaforun izin sayacını artıracağız.

07:45.660 --> 07:52.140
Bu nedenle, semafor üzerinde post API'sini çağıran herhangi bir iş parçacığının semaforun izin sayacı değerini

07:52.140 --> 07:53.580
artırması beklenir.

07:53.820 --> 07:59.310
Semaforun izin sayacı değerini artırmadan önce, semaforun izin sayacı değerinin

07:59.340 --> 08:02.940
sıfırdan küçük olup olmadığını zaten kaydetmiştik.

08:02.970 --> 08:03.720
Doğru.

08:03.720 --> 08:09.270
Dolayısıyla, semaforun izin sayacı değeri sıfırdan küçükse, semafor üzerinde engellenen bir iş parçacığı

08:09.270 --> 08:11.120
olduğu anlamına gelir.

08:11.120 --> 08:16.250
Şimdi bir sonraki adımımız bu semafora bir sinyal göndermek olmalı, değil mi?

08:16.400 --> 08:22.580
Böylece, semaforu bekleyen herhangi bir iş parçacığı olup olmadığını kontrol edeceğimi, bu iş parçacığına

08:22.610 --> 08:28.880
sinyal göndereceğimi ve böylece bu koşul değişkenine sadece bir sinyal göndereceğini görebilirsiniz.

08:28.880 --> 08:35.180
Bu, işletim sisteminiz tarafından bu koşul değişkenini bekleyen tam olarak bir iş parçacığının çağrılacağı

08:35.180 --> 08:36.320
anlamına gelir.

08:36.320 --> 08:37.100
Doğru.

08:38.730 --> 08:43.860
Elbette, işletim sisteminizin zamanlama politikasına göre bu koşul değişkenini

08:43.860 --> 08:48.810
bekleyen birden fazla iş parçacığı varsa, iş parçacıklarından birinin seçileceği

08:48.810 --> 08:52.200
ve ona CPU verileceği sizin elinizde değildir.

08:52.230 --> 08:53.010
Doğru.

08:53.010 --> 08:59.760
Ve son olarak, semaforun bu muteksinin kilidini açacağız ve bu Semafor API'sinin uygulanmasını

08:59.760 --> 09:01.530
tamamlar.

09:01.950 --> 09:08.730
Basit post API uygulamasının da oldukça basit olduğunu ve oldukça sezgisel olduğunu görebilirsiniz.

09:08.730 --> 09:13.170
Semaforun nasıl çalıştığına ilişkin teori bölümünde tartıştıklarımız.

09:13.170 --> 09:21.300
Bekle ve gör sonrası API'lerinde tam olarak aynı şeyi uyguluyoruz ve örneğin CMA Destroy, ardından CMA,

09:21.300 --> 09:28.460
CMA, ET cetera için yeni CMA almak için CMA'nın geri kalan API'lerinin uygulanmasını tamamlamanızı

09:28.500 --> 09:30.690
bekliyorum.

09:30.690 --> 09:31.260
Değil mi?

09:31.410 --> 09:35.190
Böylece, mini CMA dört kitaplığımız hazır.

09:35.220 --> 09:38.800
CMA dot ve CMA dot C dosyanız hazır olmalıdır.

09:38.800 --> 09:45.310
Ve şimdi standart CMA dört kullanarak zaten uyguladığınız bir problemi uygulamalısınız.

09:45.340 --> 09:51.730
Tek fark, bu kez standart CMA düşüşlerini kullanmak yerine, lütfen özel CMA kuvvetinizi

09:51.730 --> 09:55.450
kullanın ve burada çıktının aynı kaldığını görün.

09:55.450 --> 09:56.230
Değil mi?

09:56.230 --> 09:57.580
Tebrik ederim.

09:57.580 --> 10:00.520
Artık kendi CMA gücünüzü uygulayabilirsiniz.
