WEBVTT

00:06.050 --> 00:11.840
Evet arkadaşlar, şimdi semaforların kullanımını gösteren çok basit bir örnek yazalım.

00:11.870 --> 00:18.560
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

00:18.560 --> 00:23.150
kritik bölüm içinde çalışmasını kısıtlamamız gerekiyor.

00:23.150 --> 00:23.900
Doğru.

00:23.930 --> 00:30.230
Geri kalan üç iş parçacığı kritik bölümün dışında beklemeli ve kritik bölüme sadece ve sadece

00:30.230 --> 00:37.460
kritik bölümün içinde çalışan iş parçacığı kritik bölümü gerçekten terk ettiğinde girmelidir.

00:37.460 --> 00:38.240
Doğru.

00:38.270 --> 00:43.940
Bu basit örnekte, kritik bölüm içinde çalışan iş parçacığı tarafından basitçe bazı

00:43.940 --> 00:48.350
mesajlar yazdırarak kritik bölüm kodunu taklit edeceğiz.

00:48.380 --> 00:54.250
Bu, başvurabileceğiniz kaynak dosyadır ve tartışacağımız da bu kaynak dosyadır.

00:54.260 --> 00:54.920
Değil mi?

00:54.920 --> 00:57.050
Yani sorun ifadesi çok basit.

00:57.050 --> 01:03.020
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

01:03.020 --> 01:04.250
vermemiz gerekiyor.

01:11.070 --> 01:18.180
Ekranda, dizin multithreading slash semaforunun içinde olduğumu görebilirsiniz.

01:18.180 --> 01:22.380
Ve bu da uygulayacağımız dosya, değil mi?

01:22.530 --> 01:26.850
Bu, semaforların kullanımını gösteren çok basit bir örnektir.

01:26.880 --> 01:33.570
Bu örnekte bazı ham kodlar yazdım ve bu kodu geliştireceğiz, böylece bir ana fonksiyonumuz olduğunu

01:33.570 --> 01:40.350
görebilirsiniz ve beş iş parçacığı oluşturmamız gerektiğinden, bu nedenle beş iş parçacığı tutamacı

01:40.470 --> 01:48.180
aldım ve bu beş iş parçacığı tutamacını kullanarak beş iş parçacığı oluşturacağım veya başlatacağım.

01:48.300 --> 01:49.140
Doğru.

01:49.770 --> 01:57.870
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

01:57.870 --> 02:01.500
basit bir işlev olan iş parçacığı işlevine bağlı.

02:01.500 --> 02:07.890
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.

02:07.920 --> 02:08.670
Doğru.

02:09.760 --> 02:10.270
İşte.

02:10.270 --> 02:12.700
Uyku 1'i kullandığımı görebilirsiniz.

02:12.730 --> 02:19.060
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ü

02:19.060 --> 02:21.640
tanımlamak için yalnızca bir dizedir.

02:21.640 --> 02:22.320
Doğru.

02:22.330 --> 02:27.940
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

02:27.940 --> 02:34.720
tam olarak hangi iş parçacığının yürütüldüğünü belirlemek için bu iş parçacığı adını kullanabiliriz.

02:35.260 --> 02:39.700
Yani bu programı derleyip çalıştırırsanız, çıktıyı görürsünüz.

02:39.700 --> 02:40.950
Bunun gibi bir şey.

02:40.960 --> 02:46.660
Yani, beş iş parçacığının tamamı for döngüsü içinde çalışacaktır.

02:47.830 --> 02:52.780
Bu örnekte, bu for döngüsünü kritik bölüm kodu olarak değerlendirdik.

02:52.780 --> 02:53.470
Değil mi?

02:55.420 --> 02:58.000
Yani bu sadece kritik bölümün bir simülasyonudur.

02:58.000 --> 03:04.570
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

03:04.570 --> 03:05.290
yoktur.

03:05.290 --> 03:12.580
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.

03:12.580 --> 03:17.050
Yani aslında hangi kritik bölüm kodu olduğu önemli değildir.

03:17.080 --> 03:22.120
Ö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.

03:22.360 --> 03:25.750
Yani şu andan itibaren bu programda semafor yok.

03:25.750 --> 03:29.740
Bu nedenle, beş iş parçacığının tümü bu for döngüsünü yürütecektir.

03:30.010 --> 03:30.790
Değil mi?

03:31.480 --> 03:38.740
Ş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

03:38.740 --> 03:40.450
görelim.

03:40.720 --> 03:46.780
Bu yüzden yapacağım ilk şey semaphore dot h başlık dosyasını dahil etmek olacaktır.

03:46.840 --> 03:52.330
Şimdi bu örnek bizi semafor API'lerine de aşina kılıyor.

03:52.330 --> 03:59.390
Böylece semaphore dot h başlık dosyasını ekledikten sonra, artık semaphore nesnesini tanımlayabilirim.

03:59.390 --> 04:00.200
Değil mi?

04:00.200 --> 04:04.250
Böylece bu veri tipi kullanılarak semafor nesnesi oluşturulabilir.

04:04.250 --> 04:05.360
Sam, T'nin altını çiz.

04:05.660 --> 04:11.840
Bu, semafor değişkenlerini bildirmek için bize sağlanan Posix veri yapılarıdır.

04:11.840 --> 04:12.590
Doğru.

04:12.590 --> 04:21.020
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

04:21.020 --> 04:25.010
iş parçacığının girmesine izin vermemiz gerekiyor.

04:25.010 --> 04:33.530
Bu nedenle, izin sayısı değeri iki olarak tanımlanmıştır Şu anda ana işlevde yapacağım

04:33.530 --> 04:37.520
ilk şey semaforu başlatmaktır.

04:37.730 --> 04:44.240
Semaforu başlatmak için bir API Sam underscore'umuz var ve üç argüman kabul ediyor.

04:44.240 --> 04:48.350
İlk bağımsız değişken, başlatmakta olduğunuz semafora bir işaretçidir.

04:48.350 --> 04:51.500
İkinci argümanı her zaman sıfır olarak geçebilirsiniz.

04:51.530 --> 04:54.200
Bu ikinci argümana daha sonra tekrar döneceğiz.

04:54.200 --> 04:58.910
Üçüncü bağımsız değişken ise semaforu başlatmak istediğiniz ilk değerdir.

04:59.120 --> 05:03.560
Burada semaforu iki değeriyle başlatıyoruz, değil mi?

05:03.920 --> 05:10.640
Yani bu, semaforumuzun iki iş parçacığının kritik bölüme girmesine izin vereceği anlamına gelir, değil mi?

05:10.970 --> 05:17.120
Ve tüm iş parçacıkları kritik bölümü yürütmeyi bitirip ana iş parçacığına katıldığında,

05:17.120 --> 05:21.800
programdan çıkmadan önce semaforu gerçekten yok edebilirsiniz.

05:21.800 --> 05:22.610
Değil mi?

05:23.120 --> 05:25.480
Bunun için API kullanabilirsiniz.

05:25.490 --> 05:26.840
Sam yok etmenin altını çiziyor.

05:27.890 --> 05:31.550
Şimdi semaforun başlatılması ve yok edilmesi tamamlanmıştır.

05:31.580 --> 05:36.230
Şimdi iş parçacığı işlevi geri çağrısı olan bu işleve odaklanalım.

05:36.350 --> 05:43.730
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ığı

05:43.730 --> 05:45.050
çalışabilsin.

05:45.080 --> 05:45.800
Doğru.

05:46.840 --> 05:53.380
Başlangıç olarak, kritik bölümün başlangıcında, yani kritik bölümün giriş noktasında,

05:53.380 --> 06:01.690
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

06:01.690 --> 06:03.120
izin verir.

06:03.130 --> 06:03.980
Doğru.

06:04.000 --> 06:06.790
Bunun için bize bir API verildi.

06:06.820 --> 06:09.310
Sam ağırlığın altını çiziyor, doğru.

06:09.310 --> 06:13.420
Ve Sima four'un işaretçisini bu API'ye aktarmamız gerekiyor.

06:14.140 --> 06:20.860
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.

06:20.860 --> 06:21.640
Doğru.

06:21.850 --> 06:28.570
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ş

06:28.570 --> 06:29.740
demektir.

06:29.980 --> 06:38.410
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

06:38.410 --> 06:41.410
ve iş parçacığı adını yazdırabiliriz.

06:41.590 --> 06:48.560
Ve bundan sonra iş parçacığı bir API sam ağırlığını çağırır ve semafor sayaç değerine bağlı

06:48.560 --> 06:53.630
olarak iş parçacığı ya engellenir ya da bu çağrının ötesine geçer.

06:53.630 --> 06:54.400
Doğru.

06:54.410 --> 07:01.760
İş parçacığı bu çağrının ötesine geçtiyse, iş parçacığı kritik bölüme girmiş demektir.

07:01.850 --> 07:02.630
Doğru.

07:03.140 --> 07:08.420
Dolayısıyla iş parçacığımız bu kritik bölümün içinde beş saniye boyunca çalışacaktır.

07:08.540 --> 07:13.640
Ve iş parçacığımız kritik bölümün yürütülmesini tamamladığında.

07:15.070 --> 07:21.460
Daha sonra iş parçacığımızın kritik bölümden çıkmadan önce kullanıcıya kritik bölümden çıktığını

07:21.460 --> 07:24.820
bildirmek için mesaj yazdırma zamanıdır.

07:24.850 --> 07:32.260
İş 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

07:32.260 --> 07:34.540
sinyal göndermelidir.

07:34.570 --> 07:35.260
Doğru.

07:35.260 --> 07:39.160
Bu nedenle, iş parçacığımız bir API sam gönderisinden yararlanır.

07:39.190 --> 07:42.880
Sam post, p iplik durumu sinyaline benzer.

07:43.030 --> 07:43.840
Doğru.

07:46.330 --> 07:53.110
Ve iş parçacığı kritik bölümden tamamen çıktıktan sonra, iş parçacığının kritik bölümden başarıyla

07:53.110 --> 07:57.460
çıktığını belirten son bir mesaj yazdırabiliriz.

07:57.580 --> 07:58.390
Doğru.

07:58.690 --> 08:02.350
Bu da bir sorun bildiriminin uygulanmasını tamamlar.

08:02.980 --> 08:10.540
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

08:10.540 --> 08:12.670
görebilirsiniz.

08:12.670 --> 08:13.300
Doğru.

08:13.330 --> 08:20.050
Tek yapmanız gereken kritik bölümü Sam Wait ve Sam post API'leri arasına sıkıştırmaktır.

08:20.080 --> 08:20.860
Doğru.

08:20.980 --> 08:28.360
Sam wait API'si, azaltma işleminden sonra semaforun değeri negatif olursa iş parçacığını engelleyecektir.

08:28.390 --> 08:36.010
Aksi takdirde semaforun değerini düşürür ve iş parçacığının sam wait çağrısını atlamasına izin verir.

08:36.010 --> 08:36.850
Doğru.

08:37.240 --> 08:40.930
Sam post API ise tam tersini yapıyor.

08:40.930 --> 08:48.950
Semaforun değerini artırır ve aynı bekleme çağrısında potansiyel olarak bekleyebilecek veya bloke olabilecek herhangi bir

08:48.950 --> 08:51.290
iş parçacığına sinyal gönderir.

08:51.290 --> 08:52.070
Doğru.

08:53.670 --> 09:00.900
Şimdi bu programı derleyip çalıştırdığınızda, herhangi bir zamanda kritik bölümde yalnızca iki iş parçacığının

09:00.900 --> 09:03.480
çalıştığını göreceksiniz.

09:03.480 --> 09:04.230
Değil mi?

09:05.330 --> 09:09.950
Bu yüzden kararı size bırakıyorum çünkü bu örnek çok basit bir örnek.

09:09.950 --> 09:16.310
Ve bu printf ifadelerinden, herhangi bir zamanda yalnızca iki iş parçacığının kritik bölümde çalışıyor

09:16.310 --> 09:22.220
olması gerektiğini, diğer iş parçacıklarının ise ya kritik bölümden çoktan çıkmış ya da kritik

09:22.220 --> 09:28.040
bölümün giriş noktasında bekliyor olmaları gerektiğini çok iyi anlayabilirsiniz.

09:28.040 --> 09:28.790
Doğru.
