Evet arkadaşlar, şimdi iş parçacıklarının eşzamansız olarak iptal edilmesinden kaynaklanan değişmezler sorununu
tartışacağız.
Bu nedenle, iş parçacıkları aniden iptal edildiğinde değişmezlik sorununa yol açabilir ve bu da bir
uygulamanın veri yapısının bozulmasına neden olabilir.
Ya da bellek sızıntısına veya yanlış sonuçlara ve yanlış hesaplamalara da yol açabilir.
Şimdi bir örnek yardımıyla değişmezler sorununu anlamaya çalışalım.
Yani değişmezler basitçe tutarsız durumdaki bir veri yapısı anlamına gelir.
Diyelim ki elimizde dört düğümden oluşan çift bağlı bir liste var.
Bu çift bağlı bir liste olduğundan, komşularıyla çift yönlü bağları olan dört düğüm vardır.
Değil mi?
Diyelim ki birinci düğüm birinci işaretçi düğüm tarafından, ikinci düğüm ise ikinci işaretçi düğüm
tarafından işaret ediliyor.
Doğru.
Ş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ı
düğümü kaldırmak istediğini varsayalım.
Doğru.
Dolayısıyla, bir düğümü bağlantı listesinin ortasından kaldırmak için işaretçileri ayarlamamız gerektiğini
zaten biliyoruz.
Doğru.
İşte bu, iki numaralı düğümün, iki numaralı düğümün çift bağlı listeden kaldırılacağı şekilde
bu çift bağlı listedeki işaretçileri ayarlayan kod parçasıdır.
Doğru.
Çift bağlı listeden bir düğümün nasıl kaldırılacağını zaten bildiğinizi varsayıyorum, değil mi?
Ş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.
Doğru.
Diyelim ki kodun ilk satırı I1 komutu olsun Bu I iki komutu
Bu I üç komutu ve son ifade de I dört komutu olsun.
Diyelim ki bir iş parçacığı I1 komutunun yürütülmesini tamamladı ve I2 komutunun yürütülmesine
başlamadan önce iş parçacığı iptal edildi, değil
mi?
Dolayısıyla, i1 komutunun yürütülmesinden hemen sonra iş parçacığının iptal edildiğini söyleyelim.
Peki bu bağlantı listesi şu anda nasıl görünecek?
Basitçe bu çift yönlü bağlantı kırılmış olacaktır.
Birinci düğüm üçüncü düğümü işaret ederken, ikinci düğüm hala birinci düğümü işaret eder.
Doğru.
Dolayısıyla, şu anda bu bağlantı listesi tutarsız bir durumdadır.
Başka bir deyişle, zamanın bu belirli noktasında bu bağlantı listesinin değişmez olduğunu söylüyoruz.
Bağlantı listesinin tüm işaretçileri, Düğüm iki bağlantı listesinden kaldırılacak şekilde düzeltilmemiştir.
Doğru.
İ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
etmesine hala ihtiyacımız var.
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
önce iptal edildi.
Doğru.
Bu nedenle, iş parçacığı iptal edildiğinde veri yapılarını güncelleme işlemi yarım bırakılmamalıdır.
Bunu yaparsa, veri yapımızın tutarsız veya değişmez duruma gelmesine yol açacaktır.
Veri yapısı güncellenirken iş parçacığı iptal edilmemelidir.
Yani bu bir kural, değil mi?
Diğer değişmez örnekleri aşağıdaki gibidir.
Dengeli bir ağaçta bir düğüm çıkarırken veya eklerken iş parçacığını iptal etme.
Dengeli ağaç kırmızı siyah ağaç veya AVL ağacı olabilir.
Değil mi?
Dolayısıyla, bu dengeli ağaçlardan bir düğüm eklediğinizde veya sildiğinizde, ağacın dengeli olmasını sağlamak
için belirli türde döndürmeler yaparız.
Düğümü ağaçtan kaldırırsanız ne olur?
Ancak iş parçacığınız bu ağaç üzerinde dengeleme işlemlerini gerçekleştirmeden önce iş parçacığı iptal edilir.
Değil mi?
Bu da veri yapısını yine tutarsız bir durumda bırakacaktır.
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.
Örneğin, bir malloc sistem çağrısı diyelim.
Ş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.
Değil mi?
Sistem çağrılarının çekirdek alanında çalışan kod parçaları olduğunu zaten biliyoruz.
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üğü
iş parçacığınız iptal edilirse, bu, çekirdek alanında yarı yürütülen sistem çağrısının
da iptal edileceği anlamına gelir.
Çekirdek alanında da çekirdek bozulması varyantlarına yol açabilir.
Doğru.
Dolayısıyla temel kural, tehditlerin kontrolsüz bir şekilde iptal edilmesine izin veremeyeceğimizdir.
Kontrolsüz tarz, daha önce gördüğümüz eşzamansız tarz anlamına gelmektedir.
t bir iş parçacığı t iki iş parçacığına iptal sinyali gönderdiğinde, t iki tehdidi yürütme akışındaki
herhangi bir komutta yürütülürken iptal edilebilir.
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
verirseniz, uygulamanız veya yazılımınız kaynak sızıntısı, değişmezler veya kilitlenme sorunlarından
muzdarip olacaktır.
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.