Evet, çocuklar, dosyadayım.
Efendi köle bir.
Async iptal temizleme işleyicileri, nokta C ve ben temizleme işleyici işlevselliğini iş parçacığımıza
ekleyeceğim.
Yani bu programda ana fonksiyonda herhangi bir değişiklik yapmam gerekmiyor.
Tek yapmam gereken bu dosyada, bu işlevde, doğrudan dosyanın içinde değişiklik yapmak.
Bunun iş parçacığımız bağlamında çalıştırılan bir işlev olduğunu zaten biliyoruz, değil mi?
Şimdi bu fonksiyonda uygun bir konum veya yer bulmamız gerektiğini görebilirsiniz.
Temizleme işleyicileri eklemenin mantıklı olduğu yerler.
Böylece, 43 numaralı satırda bu fonksiyona aktarılan argümanı kullandığımızı görebilirsiniz.
Doğru.
Ayrıca bu özel argümanın heap üzerinde serbest bırakılması gereken bir bellek olduğunu da biliyoruz.
Doğru.
Öyleyse neden bu iş parçacığı iptal sinyali aldığında çağrılacak bir temizleme işleyicisi kurmuyorum ve bu temizleme
işleyicisinin amacı yalnızca bu işaretçiyi serbest bırakmak olacaktır.
Doğru.
Bu yüzden bir API pthread cleanup push çağıracağım ve işaretçiyi cleanup handler fonksiyonuma aktaracağım.
Kısa bir süre sonra bu fonksiyonun uygulamasını yazacağım.
İkinci bağımsız değişken ise, bir iptal sinyali alınması sonucunda bu fonksiyon çağrıldığında
serbest bırakılması gereken adrese bir işaretçidir.
Bu argüman bu fonksiyona bir argüman olarak aktarılacaktır.
Değil mi?
Bu iş parçacığı işlevinin kullandığı ikinci kaynak ise bu dosyadır.
Doğru.
Bu fonksiyon.
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.
Doğru.
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
temizleme işleyici işlevini yüklemesi gerektiği anlamına gelir.
Doğru.
Dolayısıyla, bu cleanup push fonksiyonuna ikinci argümanı, kapatılması gereken dosyanın işaretçisini aktarmamız
gerektiğini görebilirsiniz.
Ve birazdan bu dosya temizleme işleyici işlevinin uygulanmasını tartışacağım.
Değil mi?
Şimdiye kadar iki kaynağımız olduğu için iki temizleme işleyici işlevi yükledik, değil mi?
İlk kaynak bellek, ikinci kaynak ise dosyadır.
Şimdi, işleyici rutinlerini yığına temizlemek için duraklattığım için, bu itmeleri dengelemek
için ilgili pop API'lerini çağırmam gerekiyor, değil mi?
Yani bu basitçe, bu fonksiyondan dönmeden hemen önce bu iki satırı eklemeniz gerektiği anlamına gelir.
Bu bir iplik temizleme patlaması.
Şimdi bu P iş parçacığı temizleme pop'unu iki kez ekliyorsunuz çünkü iş parçacığı temizleme işleyici işlevlerini iş
parçacığı temizleme işleyici yığınına eklediniz.
Doğru.
Bu yüzden iki temizleme çubuğunu da yerleştirmeniz gerekir.
Yalnızca bir temizleme işleyici işlevi eklemiş olsaydınız, yalnızca bir temizleme pop işlevine ihtiyacınız
olacaktı.
Bu nedenle, push ve pop API'lerine yapılan çağrıların sayısını dengelemeye dikkat edin.
Doğru.
Bu açılış ve kapanış parantezlerini dengelemeye benziyor, değil mi?
Ve şimdi daha ileri giderek, bu temizleme işleyici işlevlerinin uygulanmasını tartışalım.
Dolayısıyla, bu temizleme işleyici işlevlerinin uygulanması çok basittir.
Yapmanız gereken tek şey aktarılan argümanı serbest bırakmaktır.
Yapmanız gereken tek şey, bu temizleme işleyici işlevinde, argüman olarak aktarılan
belleği boşaltmanızdır.
Ve diğer temizleme işleyici işlevinde, sadece dosyayı kapatmanız gerekir, değil mi?
Yani kaynak sızıntısı bu şekilde ele alınır.
İş parçacığı işleviniz her kaynak tahsis ettiğinde.
Örneğin, burada thread işleviniz bir dosya açıyor.
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
işlevini yüklediğinize dikkat edin.
Şimdi bu programı derlemeyi ve çalıştırmayı size bırakıyorum ve iş parçacığınız iptal sinyalini aldığında
bu temizleme işleyicilerinin çağrılması ve bu kaynakları serbest bırakabilmeniz gerektiğini
görüyorsunuz, değil mi?
Bu yüzden sizden bu programı derlemenizi ve aynı dizinde çalıştırmanızı bekliyorum.
Bir kabuk betiği olan compile Dot assets dosyasını görebilirsiniz ve bu kabuk betiğini çalıştırmak aslında
bu dizindeki tüm dosyaları derleyecektir.
Değil mi?