WEBVTT

00:04.980 --> 00:10.560
Evet arkadaşlar, şimdi iş parçacıklarının eşzamansız olarak iptal edilmesinden kaynaklanan değişmezler sorununu

00:10.560 --> 00:11.430
tartışacağız.

00:11.730 --> 00:17.610
Bu nedenle, iş parçacıkları aniden iptal edildiğinde değişmezlik sorununa yol açabilir ve bu da bir

00:17.640 --> 00:21.090
uygulamanın veri yapısının bozulmasına neden olabilir.

00:21.090 --> 00:25.470
Ya da bellek sızıntısına veya yanlış sonuçlara ve yanlış hesaplamalara da yol açabilir.

00:25.500 --> 00:29.580
Şimdi bir örnek yardımıyla değişmezler sorununu anlamaya çalışalım.

00:29.670 --> 00:34.050
Yani değişmezler basitçe tutarsız durumdaki bir veri yapısı anlamına gelir.

00:34.470 --> 00:38.870
Diyelim ki elimizde dört düğümden oluşan çift bağlı bir liste var.

00:38.880 --> 00:44.490
Bu çift bağlı bir liste olduğundan, komşularıyla çift yönlü bağları olan dört düğüm vardır.

00:44.490 --> 00:45.120
Değil mi?

00:45.510 --> 00:50.670
Diyelim ki birinci düğüm birinci işaretçi düğüm tarafından, ikinci düğüm ise ikinci işaretçi düğüm

00:50.670 --> 00:52.530
tarafından işaret ediliyor.

00:52.530 --> 00:53.280
Doğru.

00:53.580 --> 01:00.930
Şimdi bir iş parçacığının bu çift bağlı liste üzerinde bir işlem yürüttüğünü ve iş parçacığının bu çift bağlı listeden iki numaralı

01:00.930 --> 01:03.810
düğümü kaldırmak istediğini varsayalım.

01:03.810 --> 01:04.720
Doğru.

01:04.750 --> 01:10.090
Dolayısıyla, bir düğümü bağlantı listesinin ortasından kaldırmak için işaretçileri ayarlamamız gerektiğini

01:10.090 --> 01:11.080
zaten biliyoruz.

01:11.080 --> 01:11.740
Doğru.

01:12.960 --> 01:18.300
İşte bu, iki numaralı düğümün, iki numaralı düğümün çift bağlı listeden kaldırılacağı şekilde

01:18.300 --> 01:21.990
bu çift bağlı listedeki işaretçileri ayarlayan kod parçasıdır.

01:21.990 --> 01:22.710
Doğru.

01:22.950 --> 01:27.210
Çift bağlı listeden bir düğümün nasıl kaldırılacağını zaten bildiğinizi varsayıyorum, değil mi?

01:27.860 --> 01:35.060
Şimdi bir iş parçacığının bu bağlantı listesinden iki numaralı düğümü kaldırmak için bu kod parçasını çalıştırdığını varsayalım.

01:35.060 --> 01:35.720
Doğru.

01:35.900 --> 01:40.850
Diyelim ki kodun ilk satırı I1 komutu olsun Bu I iki komutu

01:40.850 --> 01:46.100
Bu I üç komutu ve son ifade de I dört komutu olsun.

01:46.490 --> 01:55.040
Diyelim ki bir iş parçacığı I1 komutunun yürütülmesini tamamladı ve I2 komutunun yürütülmesine

01:55.040 --> 01:59.600
başlamadan önce iş parçacığı iptal edildi, değil

02:03.050 --> 02:03.740
mi?

02:03.740 --> 02:08.640
Dolayısıyla, i1 komutunun yürütülmesinden hemen sonra iş parçacığının iptal edildiğini söyleyelim.

02:08.660 --> 02:12.890
Peki bu bağlantı listesi şu anda nasıl görünecek?

02:13.640 --> 02:17.210
Basitçe bu çift yönlü bağlantı kırılmış olacaktır.

02:17.240 --> 02:23.150
Birinci düğüm üçüncü düğümü işaret ederken, ikinci düğüm hala birinci düğümü işaret eder.

02:23.150 --> 02:23.870
Doğru.

02:24.500 --> 02:29.060
Dolayısıyla, şu anda bu bağlantı listesi tutarsız bir durumdadır.

02:29.090 --> 02:35.450
Başka bir deyişle, zamanın bu belirli noktasında bu bağlantı listesinin değişmez olduğunu söylüyoruz.

02:36.750 --> 02:43.330
Bağlantı listesinin tüm işaretçileri, Düğüm iki bağlantı listesinden kaldırılacak şekilde düzeltilmemiştir.

02:43.350 --> 02:44.070
Doğru.

02:44.490 --> 02:51.090
İkinci düğümün bu bağlantı listesinden çıkarılmasının başarılı ve eksiksiz olması için üçüncü düğümün birinci düğümü işaret

02:51.090 --> 02:53.010
etmesine hala ihtiyacımız var.

02:53.010 --> 02:58.920
Ancak iş parçacığımız, iki numaralı düğümü bu bağlantı listesinden kaldırmak için gerekli tüm işlemleri gerçekleştirmeden

02:58.920 --> 03:00.900
önce iptal edildi.

03:00.900 --> 03:01.590
Doğru.

03:01.800 --> 03:07.260
Bu nedenle, iş parçacığı iptal edildiğinde veri yapılarını güncelleme işlemi yarım bırakılmamalıdır.

03:07.260 --> 03:14.310
Bunu yaparsa, veri yapımızın tutarsız veya değişmez duruma gelmesine yol açacaktır.

03:14.550 --> 03:18.300
Veri yapısı güncellenirken iş parçacığı iptal edilmemelidir.

03:18.300 --> 03:21.000
Yani bu bir kural, değil mi?

03:21.680 --> 03:24.570
Diğer değişmez örnekleri aşağıdaki gibidir.

03:24.590 --> 03:28.750
Dengeli bir ağaçta bir düğüm çıkarırken veya eklerken iş parçacığını iptal etme.

03:28.760 --> 03:31.280
Dengeli ağaç kırmızı siyah ağaç veya AVL ağacı olabilir.

03:31.310 --> 03:31.820
Değil mi?

03:31.820 --> 03:38.240
Dolayısıyla, bu dengeli ağaçlardan bir düğüm eklediğinizde veya sildiğinizde, ağacın dengeli olmasını sağlamak

03:38.240 --> 03:40.760
için belirli türde döndürmeler yaparız.

03:40.790 --> 03:44.060
Düğümü ağaçtan kaldırırsanız ne olur?

03:44.060 --> 03:50.150
Ancak iş parçacığınız bu ağaç üzerinde dengeleme işlemlerini gerçekleştirmeden önce iş parçacığı iptal edilir.

03:50.150 --> 03:50.780
Değil mi?

03:50.780 --> 03:54.560
Bu da veri yapısını yine tutarsız bir durumda bırakacaktır.

03:54.800 --> 04:00.800
Başka bir örnek de iş parçacığınızın doğru bir sistem çağrısı yürütüyor olmasıdır.

04:00.800 --> 04:03.590
Örneğin, bir malloc sistem çağrısı diyelim.

04:03.590 --> 04:09.890
Şimdi malloc aslında bir sistem çağrısı değildir, ancak sonunda bellek tahsisi için bir sistem çağrısı çağırır.

04:09.890 --> 04:10.610
Değil mi?

04:10.640 --> 04:15.350
Sistem çağrılarının çekirdek alanında çalışan kod parçaları olduğunu zaten biliyoruz.

04:15.860 --> 04:23.400
Bu nedenle, sistem çağrısı çekirdek alanında yürütülürken, adına sistem çağrısının yürütüldüğü

04:23.400 --> 04:29.640
iş parçacığınız iptal edilirse, bu, çekirdek alanında yarı yürütülen sistem çağrısının

04:29.640 --> 04:33.210
da iptal edileceği anlamına gelir.

04:33.900 --> 04:38.220
Çekirdek alanında da çekirdek bozulması varyantlarına yol açabilir.

04:38.220 --> 04:39.030
Doğru.

04:39.650 --> 04:45.890
Dolayısıyla temel kural, tehditlerin kontrolsüz bir şekilde iptal edilmesine izin veremeyeceğimizdir.

04:46.070 --> 04:50.010
Kontrolsüz tarz, daha önce gördüğümüz eşzamansız tarz anlamına gelmektedir.

04:50.030 --> 04:56.990
t bir iş parçacığı t iki iş parçacığına iptal sinyali gönderdiğinde, t iki tehdidi yürütme akışındaki

04:56.990 --> 05:01.280
herhangi bir komutta yürütülürken iptal edilebilir.

05:01.370 --> 05:08.780
Bir programcı veya geliştirici olarak iş parçacığının yürütme akışının herhangi bir noktasında aniden iptal edilmesine izin

05:08.780 --> 05:14.660
verirseniz, uygulamanız veya yazılımınız kaynak sızıntısı, değişmezler veya kilitlenme sorunlarından

05:14.660 --> 05:16.640
muzdarip olacaktır.

05:16.640 --> 05:22.760
Bu yüzden bir sonraki ders videosunda iş parçacığının rastgele iptal edilmesinin nasıl kilitlenmelere yol açabileceğini açıklayacağım.
