WEBVTT

00:05.050 --> 00:10.960
Evet arkadaşlar, şimdi birden fazla koşul değişkeni kullandığımız senaryoyu tartışalım.

00:11.320 --> 00:17.320
Yani koşul değişkeni, bildiğimiz gibi, mutex nesnesi veya mutex değişkeni ve yüklem olarak adlandırdığımız

00:17.320 --> 00:19.180
bir koşul ile ilişkilidir.

00:19.210 --> 00:24.850
Şu anda koşul değişkenlerine zaten aşinayız ve koşul değişkeninin çalışması için bir

00:24.850 --> 00:28.450
mutex ve bir yüklem gerektiğini zaten biliyoruz.

00:28.450 --> 00:29.170
Doğru.

00:30.950 --> 00:35.110
Muteks bu yüklem için karşılıklı münhasırlık sağlar.

00:35.120 --> 00:42.260
Yani, bir iş parçacığı bu yüklemi kontrol ettiğinde, süreçteki başka hiçbir iş parçacığı bu yüklemin sonucunu

00:42.290 --> 00:44.090
değiştirmemelidir.

00:44.630 --> 00:50.240
Dolayısıyla bu muteksin görevi, bu yüklem kontrolünde karşılıklı münhasırlık sağlamaktır.

00:50.840 --> 00:57.200
Dolayısıyla, ileriye dönük olarak, birçok koşul değişkeni aynı muteksle ve aynı anda ilişkilendirilebilir.

00:57.200 --> 01:03.500
Ancak bir koşul değişkeni aynı anda birden fazla muteks ile ilişkilendirilemez.

01:03.500 --> 01:07.010
Dolayısıyla, aklınızda tutmanız gereken kurallar bunlardır.

01:09.190 --> 01:11.170
Bu yüzden konuyu detaylandırmaya çalışayım.

01:11.200 --> 01:16.770
Birincisi, birçok koşul değişkeninin aynı anda aynı muteks ile ilişkilendirilebilmesidir.

01:16.780 --> 01:18.520
Burada Manny kelimesine dikkat edin.

01:18.520 --> 01:24.000
Yani, birden fazla koşul değişkeni vardır ve yalnızca bir mutex nesnesi vardır.

01:24.010 --> 01:30.250
Diyelim ki süreçte bir t1 iş parçacığı var, bir T2 iş parçacığı var ve bir t3 iş parçacığı var,

01:30.280 --> 01:33.880
T1 iş parçacığının kendi koşul değişkeni var.

01:33.880 --> 01:39.790
KV bir diyelim T2 iş parçacığının cv2 ve iş parçacığı olarak adlandırılan kendi koşul değişkeni vardır.

01:39.820 --> 01:42.940
T3'ün kendi koşul değişkeni vardır, örneğin KV üç.

01:43.880 --> 01:52.190
Şimdi de süreç içinde bir R kaynağı olduğunu ve bu R kaynağının kendi muteksine sahip olduğunu varsayalım.

01:52.220 --> 01:53.720
Tamam.

01:53.750 --> 01:59.660
Unutmayın, Mutex her zaman bir kaynağın özelliğidir, oysa koşul değişkeni bir kaynağın özelliği olabileceği

01:59.660 --> 02:02.630
gibi iş parçacığının da bir özelliği olabilir.

02:02.660 --> 02:07.550
Bu durumda, koşul değişkenleri ilgili iş parçacıklarının özelliğidir.

02:07.550 --> 02:08.270
Doğru.

02:08.270 --> 02:11.180
Ve her iş parçacığının kendi koşul değişkeni vardır.

02:11.420 --> 02:16.490
Şimdi birinci iş parçacığının kaynağı meşgul bulduğunu varsayalım.

02:16.520 --> 02:24.460
Yani, başka bir iş parçacığı bu kaynak üzerinde zaten bir kilit almıştır, bu nedenle t iş parçacığı beklemek istemektedir.

02:24.470 --> 02:24.980
Doğru.

02:24.980 --> 02:27.310
Yani, kendisini engellemek ister.

02:27.320 --> 02:33.350
Yani t iş parçacığı p iş parçacığı p iş parçacığı koşulunu çağıracaktır.

02:33.350 --> 02:33.830
Bekle.

02:33.830 --> 02:38.720
Kendi koşul değişkenini geçirecek ve muteksi geçirecektir.

02:38.720 --> 02:40.310
Sağa.

02:40.310 --> 02:42.620
İşte bu muteks.

02:45.040 --> 02:50.290
Bu yüzden wait API'sine ikinci argüman olarak aktardığımız mutex'in kaynağa ait mutex olduğunu

02:50.320 --> 02:51.300
hatırlayın.

02:51.310 --> 02:53.560
Yani bu API iş parçacığı tarafından çağrılır.

02:53.770 --> 02:59.920
Bir iş parçacığı t iki iş parçacığı koşulu olan aynı API'yi çağıracaktır.

02:59.920 --> 03:06.070
Bekle ve kendi koşul değişkenini ve aynı muteksi geçirecektir.

03:06.310 --> 03:08.050
Ve aynı şey iplik için de geçerli.

03:08.080 --> 03:08.890
T 3.

03:09.070 --> 03:12.490
Yani, p iş parçacığı koşulunu da çağıracaktır.

03:12.490 --> 03:13.450
Bekle.

03:15.090 --> 03:18.680
Kendi koşul değişkenini ve RCM'yi geçirecektir.

03:19.260 --> 03:26.280
Burada birden fazla koşul değişkeninin söz konusu olduğunu, ancak muteks nesnesinin aynı olduğunu görebilirsiniz,

03:26.490 --> 03:27.270
değil mi?

03:28.280 --> 03:32.570
Yani şimdi tüm T1, T2 ve T3 iş parçacıkları gerçekten engellenmiş durumda.

03:32.600 --> 03:34.720
Şimdi elimizde bir iplik olduğunu varsayalım.

03:34.730 --> 03:42.770
Diyelim ki iş parçacığı t s ve bu iş parçacığı bir sinyal iş parçacığı ve bazı x, y, z nedenlerinden dolayı,

03:42.770 --> 03:49.550
t s iş parçacığının t2 iş parçacığına doğru sinyal vermeyi seçtiğini varsayalım.

03:49.580 --> 03:56.360
t1 ve t3 iş parçacıklarına sinyal göndermek istemez, sadece t2 iş parçacığının yürütmeye devam etmesini ister.

03:56.660 --> 04:06.290
Yani thread t s, p thread koşul sinyali API'sini çağıracaktır, ancak burada geçireceği koşul değişkeni thread'in koşul

04:06.290 --> 04:08.540
değişkeni olacaktır.

04:08.570 --> 04:09.200
T 2.

04:09.830 --> 04:15.950
Dolayısıyla, sinyal veren iş parçacığı bu API'yi çağırır çağırmaz, sinyal t iki iş parçacığına gidecek ve yürütmeye

04:15.950 --> 04:18.920
devam edecek olan t2 iş parçacığı olacaktır.

04:19.040 --> 04:19.790
Doğru.

04:19.820 --> 04:23.240
İplik t bir ve t üç bloke olarak kalacaktır.

04:23.360 --> 04:27.740
Böylece her bir iş parçacığının kendi koşulunu beklediğini görebilirsiniz.

04:27.740 --> 04:34.560
Değişken, o zaman geliştiricinin iş parçacığına seçici olarak sinyal vermesi kolaylaşır.

04:34.740 --> 04:40.740
Yani, geliştirici T1 iş parçacığını mı yoksa t2 iş parçacığını mı devam ettirmek istediğini seçebilir.

04:40.770 --> 04:41.370
T 3.

04:41.400 --> 04:42.090
Doğru.

04:42.120 --> 04:47.280
Programcının sinyal API'sine argüman olarak aktaracağı sinyal değişkeni.

04:47.310 --> 04:51.750
Bu koşul değişkenini bekleyen iş parçacığı devam ettirilecektir.

04:51.930 --> 04:52.740
Doğru.

04:53.260 --> 05:01.630
İş parçacığına özel koşul değişkeninin kullanılması, programcıya iş parçacıklarını seçici olarak engelleme veya devam ettirme konusunda daha fazla

05:01.630 --> 05:03.810
güç veya daha fazla kontrol sağlar.

05:03.820 --> 05:12.460
Şimdi, bunun aksine, aynı kaynak ah için zaten mutex m'ye sahip olduğumuzu ve bir koşul değişkenimiz

05:12.490 --> 05:15.460
olduğunu varsayalım.

05:15.500 --> 05:20.580
KV kaynağa özgü koşul değişkeni, değil mi?

05:20.590 --> 05:27.070
Şimdi bu durumda yalnızca bir koşul değişkeni vardır ve bu koşul değişkeni artık kaynağa

05:27.070 --> 05:27.940
özgüdür.

05:27.940 --> 05:33.730
CB1, Cv2 veya cv3 koşul değişkeni yoktur.

05:34.790 --> 05:35.540
Doğru.

05:37.430 --> 05:44.630
Yani bu basitçe, T1 iş parçacığı kaynağın kullanılabilir hale gelmesini beklemek isterse, kaynağa

05:44.630 --> 05:50.090
özgü olan ortak koşul değişkeninin adresini ileteceği anlamına gelir.

05:50.120 --> 05:56.960
Benzer şekilde, T2 ve T3 iş parçacığı, kaynağa özgü koşul değişkeni CV olan aynı koşul değişkenini kullanarak kendilerini

05:56.960 --> 05:58.790
bloke edecektir.

05:59.450 --> 06:00.230
Doğru.

06:00.260 --> 06:06.170
Burada üç iş parçacığının da aynı koşul değişkenini beklediğini görebilirsiniz, değil mi?

06:06.530 --> 06:13.640
Şimdi sinyal veren iş parçacığı engelleyen iş parçacığının yürütülmesini devam ettirmek isterse, kaynağa

06:13.640 --> 06:18.950
özgü koşul değişkeni olan bu koşul değişkeninin adresini iletecektir.

06:18.980 --> 06:26.630
Şimdi, bu CV'nin adresini geçtikten sonra, T1T2T3 iş parçacığı arasında hangisinin engeli ilk

06:26.630 --> 06:30.560
kaldırıp çalışacağını bilmiyoruz, değil mi?

06:30.590 --> 06:31.700
Bilmiyoruz.

06:31.730 --> 06:39.490
Artık iş parçacıkları arasından hangisinin bir, T, iki veya T3 olacağını seçmek işletim sistemine kalmıştır.

06:39.600 --> 06:42.760
Yürütmeye devam etmeyi seçecektir.

06:42.780 --> 06:51.960
Sinyal iş parçacığının yalnızca bir sinyal gönderdiğini unutmayın, bu nedenle T1T2T3 arasında yalnızca bir iş parçacığı devam ettirilecektir.

06:52.500 --> 06:58.290
Hangi iş parçacığı olacağını bilmiyoruz, ancak işletim sistemi zamanlama politikasına bağlı olarak, aynı

06:58.290 --> 07:04.320
koşul değişkenini bekleyen birçok iş parçacığı arasından yalnızca bir blok iş parçacığını seçecek ve yürütmeye

07:04.320 --> 07:05.310
devam edecektir.

07:05.340 --> 07:11.910
Şimdi bu örnekte, programcı blok iş parçacıklarına seçici olarak sinyal verme yeteneğini kaybetmiştir.

07:11.910 --> 07:12.690
Değil mi?

07:14.710 --> 07:20.200
Programcı, engellemeyi kaldırmak ve yürütmeye devam etmek için T2 iş parçacığını özellikle seçemez.

07:20.200 --> 07:20.920
Doğru.

07:20.950 --> 07:26.110
Kontrol, programcının elinden altta yatan işletim sisteminin eline geçmiştir.

07:26.110 --> 07:26.980
Doğru.

07:27.220 --> 07:32.770
Artık iş parçacıklarının kendi koşul değişkenlerine sahip olması ile iş parçacığının aynı koşulu

07:32.770 --> 07:36.610
paylaşması ve bloklaması arasındaki farkı anlamışsınızdır.

07:36.610 --> 07:37.360
Değişken.

07:37.360 --> 07:38.110
Doğru.

07:38.140 --> 07:43.060
İş parçacığı aynı koşul değişkenini paylaştığında, bu koşul değişkeni bir kaynağın özelliği

07:43.060 --> 07:44.290
haline gelir.

07:44.290 --> 07:50.260
Ancak iş parçacığı kendi bireysel koşul değişkenlerine sahip olmayı seçtiğinde, bu koşul değişkenleri kendi

07:50.260 --> 07:52.420
iş parçacıklarının özelliğidir.

07:52.420 --> 07:56.530
Merak etmeyin, iş parçacıklarının her birinin kendi kişisel koşul değişkenlerine sahip

07:56.530 --> 08:03.010
olacağı belirli problem ifadelerini uygulayacağız ve programcının koşul değişkenlerini kullanarak iş parçacıklarına sinyal verme veya engelleme

08:03.010 --> 08:07.000
konusunda nasıl daha fazla nihai kontrole sahip olabileceğini göreceğiz.
