WEBVTT

00:05.020 --> 00:05.830
Evet, çocuklar.

00:05.830 --> 00:11.290
Ve şimdi önümüzdeki birkaç ders videosunda, durum değişkenlerinin ağırlık ve sinyalizasyon için nasıl

00:11.290 --> 00:13.330
kullanıldığını tartışacağız.

00:13.330 --> 00:13.980
Doğru.

00:13.990 --> 00:19.170
Çok iş parçacıklı programlar yazarken koşullu değişkenleri kapsamlı bir şekilde kullanacağız.

00:19.180 --> 00:23.050
Koşul değişkenleri iş parçacığı senkronizasyonu için yaygın olarak kullanılır.

00:23.050 --> 00:29.530
Aslında muteks ve koşul değişkenleri, gelişmiş iş parçacığı senkronizasyonu, veri yapıları ve teknikleri

00:29.530 --> 00:31.360
için temel yapı taşlarıdır.

00:32.550 --> 00:37.020
Bu nedenle, önümüzdeki birkaç ders videosunda, koşul değişkenlerini oldukça ayrıntılı bir şekilde

00:37.020 --> 00:37.890
tartışacağız.

00:38.040 --> 00:44.550
Ve basitçe, koşul değişkenleri ile ilgili sonraki üç dört ders videosunun üstünü kapatmanızı öneririm.

00:44.550 --> 00:48.540
Umarım aklınızda hiçbir soru ya da şüphe kalmayacaktır.

00:48.840 --> 00:54.390
Koşul değişkenleri ile ilgili tartışmaya başlarken, koşul değişkeni bir iş parçacığını engellemek ve bir iş parçacığına

00:54.390 --> 00:56.280
sinyal vermek için kullanılır.

00:56.370 --> 00:59.460
Bir iş parçacığını bloke etmek, bir iş parçacığını durdurmak anlamına gelir.

00:59.460 --> 01:00.210
Doğru.

01:00.210 --> 01:06.000
Yani bir iş parçacığını engellemek, koşul değişkenlerini kullanarak bir iş parçacığının yürütülmesini durdurmak anlamına gelir.

01:06.980 --> 01:12.920
Bir iş parçacığına sinyal gönderilmesi ise durdurulmuş veya engellenmiş bir tehdidin yürütülmesine devam edilmesi anlamına gelir.

01:13.400 --> 01:18.200
Şimdi ilk olarak koşul değişkeninin bir tehdidi engellemek için nasıl kullanılabileceğini tartışalım.

01:19.730 --> 01:24.800
Bu nedenle, koşul değişkenlerini iki adımda kullanarak bir tehdit bloğunun kendisini her zaman hatırlayın.

01:25.400 --> 01:28.090
İlk adım bir muteksi kilitlemektir.

01:28.100 --> 01:28.760
Değil mi?

01:28.760 --> 01:35.970
Bu diyagramda, bir t iş parçacığımız olduğunu ve koşul değişkenini kullanarak kendisini bloke etmek istediğini varsayalım.

01:35.990 --> 01:41.240
Dolayısıyla, threat t one'ın sahip olması gereken ilk şey bir mutekse sahip olmasıdır.

01:41.240 --> 01:41.900
Doğru.

01:41.900 --> 01:44.120
Ve muteks başlatılmalıdır.

01:45.160 --> 01:50.140
Yani birinci adım, iş parçacığının kendini bloke etmek için bir muteksi kilitlemesi gerektiğini söyler.

01:50.170 --> 01:51.510
Koşul değişkenini kullanma.

01:51.520 --> 01:52.210
Doğru.

01:52.210 --> 02:00.820
Burada, S1 adımında T1 iş parçacığının bir muteks nesnesi üzerinde bir kilit işgal ettiğini görebilirsiniz.

02:00.820 --> 02:01.510
Değil mi?

02:01.510 --> 02:08.050
Ve ikinci adım, koşul değişkenini kullanarak engellenmek isteyen bir iş parçacığının bir API iş parçacığı koşulunu

02:08.050 --> 02:10.030
çağırması gerektiğini söyler.

02:10.030 --> 02:10.720
Bekle.

02:10.810 --> 02:16.690
Bunun için programımızın bir koşul değişkenine sahip olması ve koşul değişkeninin ilklendirilmesi gerekir.

02:16.690 --> 02:17.470
Doğru.

02:17.710 --> 02:24.370
Şimdi, program başlatılmış bir koşul değişkenine sahip olduğunda, bir iş parçacığı bir API p iş parçacığı koşulunu çağırabilir.

02:24.370 --> 02:27.670
Bekleyin ve bu API iki argüman kabul eder.

02:27.670 --> 02:33.040
İlk argüman koşul değişkeninin adresi, ikinci argüman ise bir önceki adımda aynı iş parçacığı

02:33.040 --> 02:35.950
tarafından kilitlenen muteks'tir.

02:36.190 --> 02:37.060
Doğru.

02:37.180 --> 02:41.410
Böylece üç numaralı adımda T1 iş parçacığı engellenir.

02:42.070 --> 02:46.690
Dolayısıyla, bir iş parçacığının koşul değişkeni kullanılarak engellenmesi iki adımlı bir işlemdir.

02:46.700 --> 02:53.150
İlk olarak muteksi kilitleyin ve ikinci olarak p thread condition wait API'sini çağırın ve koşul değişkenini ilk argüman

02:53.150 --> 02:56.360
olarak ve muteksi ikinci argüman olarak geçirin.

02:56.360 --> 02:59.960
Ve bu api p iş parçacığı koşulunun çağrılmasından sonra.

02:59.960 --> 03:02.960
Bekle, başlığın engellendi.

03:02.990 --> 03:07.700
Yani üçüncü adımda T1 iş parçacığı engellenmiştir.

03:08.330 --> 03:12.320
Şimdi bu API hakkında bir şeyler anlamamız gerekiyor.

03:12.350 --> 03:13.610
Bu bir iplik koşuludur.

03:13.610 --> 03:14.300
Bekle.

03:14.510 --> 03:18.800
Bu API perde arkasında anlamamız gereken bir şey yapıyor.

03:19.400 --> 03:23.480
Yani bu API çağıran iş parçacığı tarafından çalıştırıldığında.

03:24.640 --> 03:26.800
Yani iş parçacığı p iş parçacığı koşulunu çağırdığında.

03:26.800 --> 03:27.250
Bekle.

03:27.280 --> 03:28.540
İki şey olur.

03:28.630 --> 03:32.180
İlk olarak, çağıran iş parçacığı engellenir.

03:32.200 --> 03:32.890
Doğru.

03:32.890 --> 03:37.660
Yani bu koşul değişkeninin görevi, çağıran iş parçacığının engellenmesidir.

03:37.930 --> 03:44.350
Sahne arkasında gerçekleştirilen ikinci eylem, muteks sahipliğinin çağıran iş parçacığından alınması

03:44.350 --> 03:46.940
ve kullanılabilir ilan edilmesidir.

03:46.960 --> 03:53.590
Yani bu API'ye aktardığınız ikinci argüman, yani bir önceki adımda iş parçacığı tarafından

03:53.590 --> 03:56.980
kilitlenen muteks artık sahne arkasında.

03:57.010 --> 04:04.000
Kilidi açılmıştır ve programın başka herhangi bir iş parçacığının kilitlemesi için kullanılabilir olduğu beyan edilmiştir.

04:04.850 --> 04:11.270
Bu nedenle, T1 iş parçacığı S3 adım numarasını bitirir bitirmez, bu koşula ikinci bir argüman olarak aktarılan

04:11.270 --> 04:17.990
muteks, ağırlık API'si diğer iş parçacıkları tarafından günlüğe kaydedilebilir hale gelir.

04:18.080 --> 04:24.650
Dolaylı olarak veya perde arkasında bu muteksin kilidinin açıldığını varsayabilirsiniz.

04:25.670 --> 04:27.590
Bunu kısa süre içinde anlayacağız.

04:27.590 --> 04:29.840
Bu muteks nesnesinin rolü nedir?

04:30.610 --> 04:33.730
Ve işlerin neden bu şekilde yürütüldüğünü.

04:34.300 --> 04:34.930
Doğru.

04:35.320 --> 04:36.280
Bekle biraz.

04:36.280 --> 04:37.780
Oraya gideceğiz.

04:38.140 --> 04:45.320
Şimdi, T1 iş parçacığımız S3 adımında engellenmiş durumda ve muteks kullanılabilir durumda.

04:45.340 --> 04:51.730
Şimdi programımızın kendi yürütme akışını yürüten başka bir T2 iş parçacığına sahip olduğunu varsayalım,

04:51.760 --> 04:52.600
değil mi?

04:52.870 --> 04:59.950
Şimdi T2 iş parçacığımızın bir sinyal iş parçacığı olduğunu, yani T2 iş parçacığımızın t1 iş parçacığının yürütülmesini devam ettirme

04:59.950 --> 05:02.800
sorumluluğuna sahip olduğunu varsayalım.

05:02.920 --> 05:10.000
Dolayısıyla, diğer iş parçacığı zaten engellenmiş olan iş parçacığının yürütülmesine devam etmeye çalıştığında, bu süreci sinyalizasyon olarak

05:10.000 --> 05:11.170
adlandırıyoruz.

05:11.170 --> 05:11.920
Doğru.

05:12.460 --> 05:15.650
Yani sinyalizasyon yine üç adımlı bir süreçtir.

05:15.670 --> 05:21.370
İlk adımda, T2 iş parçacığımız olan sinyalizasyon iş parçacığı bir sinyalizasyon iş parçacığıdır.

05:22.510 --> 05:24.730
İlk adım muteksi kilitlemektir.

05:24.730 --> 05:28.660
İkinci adım, bir api p iş parçacığı koşul sinyalini çağırmaktır.

05:28.750 --> 05:29.530
Doğru.

05:29.630 --> 05:32.850
Üçüncü adım ise muteksin kilidini açmaktır.

05:32.870 --> 05:41.030
Dolayısıyla, t2 iş parçacığı t1 iş parçacığına sinyal göndermek isterse, hey t1 iş parçacığı yürütmenize devam edebilirsiniz.

05:41.210 --> 05:43.900
Bu yüzden t2 iş parçacığı muteksi kilitlemelidir.

05:43.910 --> 05:47.780
Bu muteks bununla aynı muteks olmalı, değil mi?

05:48.020 --> 05:50.840
Farklı nesneler olmaları gerekmez.

05:50.840 --> 05:52.070
Aynı olmak zorundalar.

05:52.070 --> 05:52.880
Değil mi?

05:54.170 --> 06:00.860
Daha sonra S8 adımında, D2 iş parçacığı bir API P iş parçacığı koşul sinyalini çağırır ve bu API'ye aktarılan

06:00.860 --> 06:03.890
argüman bununla aynı koşul değişkenidir.

06:04.070 --> 06:04.880
Değil mi?

06:05.640 --> 06:14.040
Ve sekiz numaralı adım bir sinyale yönelik tehdit t tarafından yürütülür yürütülmez, bu işletim sisteminin

06:14.040 --> 06:18.000
bu koşul değişkenine gönderdiği sinyaldir.

06:18.000 --> 06:18.790
Değil mi?

06:18.810 --> 06:25.680
Yani, hangi iş parçacığı bu koşulda engellenirse, değişkenin yürütülmesine devam edilmesi beklenir.

06:26.100 --> 06:30.780
Bizim durumumuzda, bu koşul değişkeni üzerinde engellenen t iş parçacığıdır.

06:31.050 --> 06:39.210
Yani iş parçacığı koşul sinyali, bir iş parçacığının başka bir iş parçacığına bir sinyal veya bildirim göndererek diğer iş parçacığının

06:39.210 --> 06:45.450
engellenmiş durumdan yürütmeye devam etmesini söylemesi gibi çalışan bir API'dir.

06:46.910 --> 06:55.940
Şimdi burada T1 iş parçacığımız bu sinyali tekrar aldığında, sahne arkasında anlamamız gereken birkaç

06:55.940 --> 06:57.260
şey olur.

06:57.530 --> 07:05.990
Yani burada blok iş parçacığı sinyal aldığında bunun sinyal alan bir iş parçacığı olmadığını görebilirsiniz.

07:05.990 --> 07:08.750
Sinyali alan koşul değişkenidir.

07:08.870 --> 07:09.650
Değil mi?

07:10.040 --> 07:14.240
Yani bir blok iş parçacığı veya bir koşul değişkeni bir sinyal aldığında.

07:15.550 --> 07:17.830
Blog başlığı burada.

07:17.830 --> 07:22.660
T1 iş parçacığı olan koşul değişkeni üzerinde engellenen iş parçacığını temsil eder.

07:22.780 --> 07:30.040
T1 iş parçacığı veya engellenen iş parçacığı yürütmeye hazır duruma geçer ve muteksin serbest kalmasını bekler.

07:30.220 --> 07:39.790
Dolayısıyla, t1 iş parçacığımız gerçekten yürütmeye devam etmez, ancak yürütmeye hazır duruma geçer.

07:40.960 --> 07:41.680
Doğru.

07:41.680 --> 07:48.640
Yani burada bu kırmızı, tehdidin yürütülmeye hazır duruma girdiğini ancak aslında henüz yürütülmeye

07:48.640 --> 07:51.460
başlamadığını temsil eder.

07:52.540 --> 07:58.690
Sadece t tehdidinin engellenmiş durumdan yürütülmeye hazır duruma geçtiğini söylüyoruz.

07:58.960 --> 08:04.240
İkinci nokta, muteks sinyal veren iş parçacığı tarafından serbest bırakılır bırakılmaz engellenen tehdide muteks

08:04.240 --> 08:06.250
üzerinde bir kilit verildiğini söyler.

08:06.250 --> 08:07.060
Doğru.

08:07.390 --> 08:13.030
Bu noktada, tehdidin ardından T iki'nin sekiz numaralı adımını başarıyla gerçekleştirdiğini

08:13.030 --> 08:18.160
ve sinyalin T bir tehdidine çoktan gönderildiğini varsayalım.

08:18.160 --> 08:23.560
Şimdi t iki tehdidinin s dokuz numaralı adımı başarıyla gerçekleştirdiğini varsayalım.

08:23.590 --> 08:27.640
Yani, tehdidin kilidi başarıyla açılmıştır.

08:28.120 --> 08:30.550
Üzgünüz, bu API kilit açma API'sidir.

08:30.790 --> 08:34.330
Yani T2 tehdidi muteksin kilidini başarıyla açmıştır.

08:34.330 --> 08:35.080
Doğru.

08:35.110 --> 08:42.050
Dolayısıyla, t iki tehdidi s dokuz numaralı adımın yürütülmesini başarıyla tamamlar tamamlamaz,

08:42.050 --> 08:48.380
t bir tehdidi yürütmeye hazır durumdan fiilen yürütme durumuna geçer.

08:48.410 --> 08:53.210
Bu, kişinin sahip olduğu tehdidin fiilen uygulanmaya başlaması anlamına gelir.

08:53.390 --> 08:54.230
Doğru.

08:55.460 --> 09:01.040
Yani bu, şu anda t1 iş parçacığının T1'in uyandığını yazdıracağı anlamına gelir.

09:01.070 --> 09:02.690
Tam burada.

09:02.690 --> 09:06.020
Bu print deyimi kritik bölümü temsil eder.

09:06.610 --> 09:07.280
Doğru.

09:07.480 --> 09:15.880
Engellenmiş durumda olan 31 şimdi yürütülmeye devam etti ve şimdi kritik bölümde yürütülüyor.

09:17.240 --> 09:24.790
Şimdi, iş parçacığı yürütmeye başlar başlamaz, T1 iş parçacığına muteks üzerinde bir kilit verildiğine dikkat edin.

09:24.800 --> 09:32.640
Dolayısıyla, T1 iş parçacığı gerçekten yürütüldüğünde veya yazdırıldığında, bu T1 bu satırdaki mesajla uyandırılır.

09:32.660 --> 09:38.780
Bu özel muteks, t1 iş parçacığı tarafından otomatik olarak kilitlenir.

09:39.540 --> 09:45.720
Unutmayın, iş parçacığı sinyali alır almaz yürütmeye hazır durumuna geçer.

09:45.720 --> 09:52.860
Ve sinyal veren iş parçacığı muteks üzerindeki kilidi serbest bırakır bırakmaz, kilit sinyali alan iş parçacığı

09:52.860 --> 09:55.380
tarafından derhal işgal edilir.

09:55.500 --> 09:56.280
Doğru.

09:56.280 --> 09:58.820
Ve ardından iş parçacığı yürütülmeye başlar.

09:58.830 --> 09:59.580
Doğru.

09:59.580 --> 10:02.700
Ben de tam olarak aynı adımları izliyorum.

10:03.400 --> 10:11.650
Dolayısıyla, 31 yürütmeye devam edip bu mesajı yazdırdığında, bu muteks T1 Right iş parçacığı tarafından

10:11.680 --> 10:13.690
günlüğe kaydedilir.

10:13.960 --> 10:18.820
Yani bu mesaj aslında kritik bölümü temsil ediyor, değil mi?

10:19.180 --> 10:23.770
Bu yüzden endişelenmeyin, bir sonraki ders videosunda bir örnek yardımıyla tam olarak aynı prosedürü

10:23.770 --> 10:25.000
tartışacağız.

10:25.210 --> 10:31.840
Dolayısıyla, bu kritik bölüm T1 iş parçacığı tarafından başarıyla yürütüldüğünde, t1 iş parçacığı artık aynı muteksin

10:31.870 --> 10:33.160
kilidini açabilir.

10:33.460 --> 10:34.240
Doğru.

10:35.200 --> 10:38.770
Bu yüzden S1, S3 ve S5 adımlarını açıkladım.

10:38.800 --> 10:43.870
S2 ve S4 adımlarının nerede olduğunu ve adımın nerede olduğunu düşünüyor olmalısınız.

10:43.870 --> 10:45.010
S7 Doğru.

10:45.010 --> 10:48.430
Bu adımları bir sonraki ders videosunda tartışacağız.

10:48.880 --> 10:55.810
Umarım bu ders videosu, T1 tehdidinin kendisini engellemek için koşul değişkenini nasıl kullandığını anlamanıza yardımcı

10:55.810 --> 10:56.590
olur.

10:56.590 --> 11:03.560
Sinyal iş parçacığının blok iş parçacığına sinyal göndermek için koşul değişkenini nasıl kullandığı ve blok iş parçacığının

11:03.590 --> 11:07.520
engellenmiş durumdan yürütmeye nasıl devam ettiği.

11:08.850 --> 11:13.860
Bu kural, p iş parçacığı koşulunun arkasındaki ana mantığı temsil eder.

11:13.860 --> 11:17.400
Wait API ve p thread condition signal API.

11:17.460 --> 11:18.180
Doğru.

11:19.000 --> 11:28.030
t1 iş parçacığı bu p iş parçacığı koşulu kullanılarak engellendiğinde bu muteksin kilidinin otomatik olarak açılacağını

11:28.030 --> 11:29.170
unutmayın.

11:29.170 --> 11:37.840
Wait API ve t1 iş parçacığı bu sinyali alır almaz, t1 iş parçacığı yürütmeye hazır durumuna

11:37.840 --> 11:39.250
geçer.

11:39.790 --> 11:47.470
Doğru ve t1 iş parçacığı yalnızca sinyal iş parçacığı olduğunda yürütmeye hazır durumundan fiilen yürütme durumuna

11:47.470 --> 11:48.430
geçecektir.

11:48.470 --> 11:51.160
T2 muteksin kilidini açar.

11:51.190 --> 11:52.000
Doğru.

11:52.090 --> 11:59.470
Muteksin kilidi sinyal veren iş parçacığı tarafından açılır açılmaz, engelleyen iş parçacığı muteks üzerinde kilitlenir

11:59.710 --> 12:03.430
ve aslında hazır durumdan yürütme durumuna geçer.

12:03.430 --> 12:04.150
Doğru.

12:04.150 --> 12:10.150
Bu ders videosunda ele aldığımız tüm adımların özetini bir kez daha gözden geçirdim.

12:10.540 --> 12:15.820
Şimdi, bir sonraki ders videosunda, bir alıştırma daha yapalım ve bekleme ve sinyalizasyonun nasıl çalıştığını anlamaya

12:15.820 --> 12:16.690
çalışalım.

12:17.110 --> 12:19.970
Ve bunu bir örnek yardımıyla tartışacağız.

12:19.970 --> 12:26.450
Bu, bir kaynak olarak hareket eden bazı veri yapılarını alarak ve bu kaynak için rekabet eden iş parçacıkları

12:26.450 --> 12:27.770
vardır.
