WEBVTT

00:05.590 --> 00:07.330
Evet, çocuklar, dosyadayım.

00:07.330 --> 00:08.470
Efendi köle bir.

00:08.500 --> 00:14.800
Async iptal temizleme işleyicileri, nokta C ve ben temizleme işleyici işlevselliğini iş parçacığımıza

00:14.800 --> 00:15.820
ekleyeceğim.

00:16.090 --> 00:20.370
Yani bu programda ana fonksiyonda herhangi bir değişiklik yapmam gerekmiyor.

00:20.380 --> 00:25.980
Tek yapmam gereken bu dosyada, bu işlevde, doğrudan dosyanın içinde değişiklik yapmak.

00:25.990 --> 00:32.170
Bunun iş parçacığımız bağlamında çalıştırılan bir işlev olduğunu zaten biliyoruz, değil mi?

00:33.010 --> 00:39.820
Şimdi bu fonksiyonda uygun bir konum veya yer bulmamız gerektiğini görebilirsiniz.

00:40.540 --> 00:44.110
Temizleme işleyicileri eklemenin mantıklı olduğu yerler.

00:44.830 --> 00:52.930
Böylece, 43 numaralı satırda bu fonksiyona aktarılan argümanı kullandığımızı görebilirsiniz.

00:52.930 --> 00:53.590
Doğru.

00:53.590 --> 00:59.430
Ayrıca bu özel argümanın heap üzerinde serbest bırakılması gereken bir bellek olduğunu da biliyoruz.

00:59.440 --> 01:00.100
Doğru.

01:00.100 --> 01:07.210
Öyleyse neden bu iş parçacığı iptal sinyali aldığında çağrılacak bir temizleme işleyicisi kurmuyorum ve bu temizleme

01:07.210 --> 01:12.420
işleyicisinin amacı yalnızca bu işaretçiyi serbest bırakmak olacaktır.

01:12.430 --> 01:13.260
Doğru.

01:13.270 --> 01:20.680
Bu yüzden bir API pthread cleanup push çağıracağım ve işaretçiyi cleanup handler fonksiyonuma aktaracağım.

01:20.680 --> 01:24.370
Kısa bir süre sonra bu fonksiyonun uygulamasını yazacağım.

01:24.370 --> 01:30.070
İkinci bağımsız değişken ise, bir iptal sinyali alınması sonucunda bu fonksiyon çağrıldığında

01:30.070 --> 01:33.640
serbest bırakılması gereken adrese bir işaretçidir.

01:33.640 --> 01:37.600
Bu argüman bu fonksiyona bir argüman olarak aktarılacaktır.

01:37.600 --> 01:38.410
Değil mi?

01:40.240 --> 01:45.940
Bu iş parçacığı işlevinin kullandığı ikinci kaynak ise bu dosyadır.

01:45.940 --> 01:46.630
Doğru.

01:46.660 --> 01:47.440
Bu fonksiyon.

01:47.740 --> 01:54.550
Bu iş parçacığı işlevi bu dosyayı doğru modda açar ve iş parçacığı iptal edildiğinde bu dosya kapatılmalıdır.

01:54.550 --> 01:55.270
Doğru.

01:55.300 --> 02:02.860
Yani bu basitçe, dosya açılışı başarılı olduğunda, iş parçacığımızın sorumluluğu yalnızca bu dosyayı kapatmak olacak

02:02.860 --> 02:07.540
temizleme işleyici işlevini yüklemesi gerektiği anlamına gelir.

02:07.540 --> 02:08.290
Doğru.

02:08.410 --> 02:13.570
Dolayısıyla, bu cleanup push fonksiyonuna ikinci argümanı, kapatılması gereken dosyanın işaretçisini aktarmamız

02:13.570 --> 02:15.460
gerektiğini görebilirsiniz.

02:15.460 --> 02:20.620
Ve birazdan bu dosya temizleme işleyici işlevinin uygulanmasını tartışacağım.

02:20.620 --> 02:21.280
Değil mi?

02:21.280 --> 02:26.710
Şimdiye kadar iki kaynağımız olduğu için iki temizleme işleyici işlevi yükledik, değil mi?

02:26.710 --> 02:30.310
İlk kaynak bellek, ikinci kaynak ise dosyadır.

02:31.120 --> 02:38.350
Şimdi, işleyici rutinlerini yığına temizlemek için duraklattığım için, bu itmeleri dengelemek

02:38.350 --> 02:42.620
için ilgili pop API'lerini çağırmam gerekiyor, değil mi?

02:42.740 --> 02:49.430
Yani bu basitçe, bu fonksiyondan dönmeden hemen önce bu iki satırı eklemeniz gerektiği anlamına gelir.

02:49.430 --> 02:51.200
Bu bir iplik temizleme patlaması.

02:51.680 --> 02:57.710
Şimdi bu P iş parçacığı temizleme pop'unu iki kez ekliyorsunuz çünkü iş parçacığı temizleme işleyici işlevlerini iş

02:57.710 --> 03:00.530
parçacığı temizleme işleyici yığınına eklediniz.

03:00.530 --> 03:01.190
Doğru.

03:01.190 --> 03:04.160
Bu yüzden iki temizleme çubuğunu da yerleştirmeniz gerekir.

03:04.190 --> 03:08.960
Yalnızca bir temizleme işleyici işlevi eklemiş olsaydınız, yalnızca bir temizleme pop işlevine ihtiyacınız

03:08.960 --> 03:09.590
olacaktı.

03:09.590 --> 03:14.900
Bu nedenle, push ve pop API'lerine yapılan çağrıların sayısını dengelemeye dikkat edin.

03:14.930 --> 03:15.590
Doğru.

03:15.590 --> 03:20.930
Bu açılış ve kapanış parantezlerini dengelemeye benziyor, değil mi?

03:22.710 --> 03:28.470
Ve şimdi daha ileri giderek, bu temizleme işleyici işlevlerinin uygulanmasını tartışalım.

03:28.470 --> 03:32.610
Dolayısıyla, bu temizleme işleyici işlevlerinin uygulanması çok basittir.

03:32.640 --> 03:36.060
Yapmanız gereken tek şey aktarılan argümanı serbest bırakmaktır.

03:36.240 --> 03:40.920
Yapmanız gereken tek şey, bu temizleme işleyici işlevinde, argüman olarak aktarılan

03:40.920 --> 03:42.390
belleği boşaltmanızdır.

03:42.390 --> 03:47.160
Ve diğer temizleme işleyici işlevinde, sadece dosyayı kapatmanız gerekir, değil mi?

03:47.160 --> 03:49.890
Yani kaynak sızıntısı bu şekilde ele alınır.

03:50.100 --> 03:54.600
İş parçacığı işleviniz her kaynak tahsis ettiğinde.

03:54.600 --> 04:00.540
Örneğin, burada thread işleviniz bir dosya açıyor.

04:00.540 --> 04:06.780
Bu nedenle, iş parçacığı işlevleriniz yeni bir kaynak ayırır ayırmaz, bu kaynağı serbest bırakmak için temizleme işleyici

04:06.780 --> 04:08.880
işlevini yüklediğinize dikkat edin.

04:08.910 --> 04:16.050
Şimdi bu programı derlemeyi ve çalıştırmayı size bırakıyorum ve iş parçacığınız iptal sinyalini aldığında

04:16.050 --> 04:22.300
bu temizleme işleyicilerinin çağrılması ve bu kaynakları serbest bırakabilmeniz gerektiğini

04:22.330 --> 04:25.660
görüyorsunuz, değil mi?

04:26.050 --> 04:31.270
Bu yüzden sizden bu programı derlemenizi ve aynı dizinde çalıştırmanızı bekliyorum.

04:31.270 --> 04:36.700
Bir kabuk betiği olan compile Dot assets dosyasını görebilirsiniz ve bu kabuk betiğini çalıştırmak aslında

04:36.700 --> 04:39.280
bu dizindeki tüm dosyaları derleyecektir.

04:39.280 --> 04:39.970
Değil mi?
