Şimdi kilit açma API'mizin uygulamasına başlayalım, bu API'de de tam olarak
aynı üç durumu ele alacağız.
Başlangıç olarak, özyinelemeli nesne için durum muteksini kilitleyerek başlayacağım çünkü kozmetik
nesnesinin durum değişkenlerini inceleyecek ve güncelleyeceğiz.
Ve unutmayın, bu kilitleme ve kilit açma API'leri sistemdeki birkaç iş parçacığı tarafından aynı anda çağrılacaktır.
Şimdi bir numaralı vakaya gelelim.
Hareket etmeye başladığında, bu nesne zaten kilitli değildir.
Yani bunun koşulunu zaten biliyoruz.
Yani bu durumda, mevcut tehdidimiz zaten kilidi açık olan özyinelemeli muteks nesnesinin kilidini açmaya çalışıyor.
Yani basitçe, programınızın yapmaması gereken bir şeyi yaptığı anlamına gelir.
Bu nedenle, programınızın mantıklı olmayan bir şey yapmaya çalıştığını, Amtrak'ın kilidini açmaya çalıştığını,
zaten kilidi açık durumdayken nesnesiyle ilgili makalelerin kilidini açmaya çalıştığını iddia etmeyi seçerdim.
Hiçbir işlem yapmamayı ve sadece yazmayı da seçebilirsiniz.
Ancak ben katı biri olacağım ve programımın çökmesini tercih ederim çünkü geliştiricinin zaten kilidi açılmış özyinelemeli
Nadex nesnesi üzerinde bir kilit açma API'si çağırmasını istemiyorum.
Şimdi, söylenecek durum numarası, bir özyinelemeli muteks nesnesinin kendi kendini eğiten tarafından günlüğe kaydedildiğidir.
Bu mantığı yürüten parça budur.
Bunun koşulunu zaten biliyoruz.
Yani bu durumda, tehdit artık mutex nesnesinde bu kayıtta elde ettiği yasalardan birini gerçekleştiriyor.
O halde bir tahminde bulunalım çünkü ve değeri şu anda sıfır olamaz ve ve değerini azaltacağız ve bu, bu iş
parçacığı tarafından bu özyinelemeli muteks nesnesi üzerinde alınan kilit sayısıdır.
Şimdi de kilit sayısının ne kadar olduğunu test edeceğim.
Hala sıfırdan büyük mü, o zaman ne yapmalıyım, bu işlevi yürüten bu özel tehdit ne yapmalı?
Bu basitçe, mevcut eğilimin bir miktar endeksi daire üzerinde kilitli tutmaya devam etmek olduğu anlamına gelir.
Eğer durum buysa, o zaman bu eyaletin yeni vergisinin kilidini açın ve iade edin.
Mevcut yürütme üçlüsünün başka bir şey yapmasına gerek yok.
Basitçe, müşteri desteleri nesnesi türünde aldığı kilit sayısını azaltır ve
bu an değeri hala sıfırdan büyükse, mevcut yürütme üçlüsünün bu özyinelemeli muteks nesnesi üzerinde bir kilit biriktirmeye
devam ettiği anlamına gelir.
O yüzden geri dönün.
İşimiz bitti.
Ancak durum böyle değilse, yani mevcut yürütme iş parçacığı bu özyinelemeli muteks nesnesi üzerindeki tüm kilitleri serbest
bıraktığında 76 numaralı başlığı atacağız.
Bu durumda, bunu test etmeliyiz.
Öyle olan başka bir konu var mı?
Bu geri çağırma, bazı muteks nesneleri üzerinde bir kilit tutmak için bloglandı.
Sistemde her zaman bir tür tehdit olabilir.
Bu özyinelemeli muteks nesnesi onlar için kullanılabilir olmadığından engellendi.
Bu durumda, bu özyinelemeli muteks nesnesi üzerinde engellenen iş parçacığı sayısının sıfırdan büyük
olması koşulunu test ederek bunu yapabiliriz.
O zaman basitçe, mevcut yürütme iş parçacığı bir sinyal yayınlayabilir, böylece bu belirli koşul değişkeninde
engellenen iş parçacıkları arasından tam olarak bir iş parçacığı yürütmeye başlayabilir.
Bu ipliklerden tam olarak bir tanesi 42 numaralı satırın ötesinde parçalanacaktır.
Tamam.
Ve şimdi mevcut yürütme ticaretimizin işi bitti.
Dolayısıyla, bu özyinelemeli izi günlüğe kaydedilmediği için işaretleyeceğiz.
Sistemdeki başka herhangi bir iplik tarafından, çünkü şimdi tamamen serbest bırakıldı.
Bu yüzden kilitleme iş parçacığının kilidi başlattığını ve tekrar sıfırlamayı denediğini ve iki numaralı durumla işimizin bittiğini
söyleyebilirim.
İşin zor kısmı şu ki, kilitli bir iş parçacığı bu özyinelemeli muteks nesnesi üzerindeki tüm kilitlerini
serbest bıraktığında, mevcut iş parçacığı üzerindeki çağıran iş parçacığı, bu özyinelemeli muteks
nesnesi üzerinde bir kilit elde etmek için engellenmiş herhangi bir iş parçacığı olup olmadığını test etmelidir, o zaman mevcut
iş parçacığımız bir sinyal vermelidir, böylece bu koşul değişkeni üzerindeki engellenmiş iş parçacıkları arasından tam olarak biri
yürütmeyi sürdürmeye çalışabilir ve bu özyinelemeli Murdock nesnesi üzerindeki kilidi başarıyla almaya çalışabilir.
Ve üç numaralı vaka çok kolay.
Üç numaralı vakaya girdiğimizi belirten koşulu zaten biliyoruz.
Bu, söz konusu kozmetik nesnesinin sistemdeki başka bir iş parçacığı tarafından kilitlendiği zamandır.
Peki böyle bir durumda, mevcut iş parçacığımız neden bu özyinelemeli Murdock's nesnesi üzerinde bir kilit açma API'si çağırsın?
Tamam.
Mevcut iş parçacığı ilk etapta kendisine ait olmadığı halde neden talep edilmemiş muteks nesnesinin kilidini açmaya
çalışıyor?
Ben de Seattle'ı aradım.
Tabii ki size ait olmayan bir aracı satamazsınız.
Size ait olmayan bir mülkü satamazsınız.
Dolayısıyla, üzerinde kilidiniz bile olmayan özyinelemeli yansıtılmış bir nesnenin kilidini açamazsınız.
Tamam.
Böylece kayıt muteks kilit açma API'mizin uygulaması tamamlanmış oldu.
Ve burada bir kitap var, buradan geri dönmemiz gerekiyor çünkü iki numaralı vakayı tamamlıyor.
Son olarak, Kızıl Haç ve Nuedexta grev API'sini tartışacağız.
Şimdi bu API'nin uygulanması oldukça basittir.
Tek yapmanız gereken kontrol etmek.
Bu geri çağırma işlemini hâlâ elinde tutan bir kabile olmamalı, Cimarex.
Zirve eylemlerine kilitlenen bir üçlü olmamalıdır.
Ve aslında bu kayıt üzerinde kilit bekleyen bir iş parçacığı olmamalıdır, bazı yeni parçalar, tüm bu
koşullar yerine getirilirse, o zaman sadece kayıtları ve mutex nesnesini yok etmenize izin verilir.
Bu yüzden her zaman buna dikkat etmelisiniz.
Sessiz vergileri yok edersiniz ve değerli eşyaları yalnızca sistemdeki bir davetsiz misafir tarafından kullanılmadıkları zaman koşullandırırsınız.
Aksi takdirde, tanımlanmamış davranışa yol açacaktır.
Pekala, bu koşul değişkeni üzerinde engellenen bir işlem olduğunu ve bu koşul değişkeninin yığın
bellekte olduğunu varsayalım.
Ve sistemdeki ticaretin bir kısmının bu koşul değişkeninin hafızasını serbest bıraktığını varsayalım.
Yani bu, engelleme tehdidinin artık var olmayan koşul değişkeni üzerinde engellediği anlamına gelir.
Yani tanımlanmamış bir davranış programına, çökmeye veya başka bir şeye yol açar.
Bu nedenle, sistemdeki bir nesnenin özyinelemeli muteks türünü her zaman yalnızca sistemdeki hiçbir üçlünün gerçekten
beklemediğinden emin olunduğunda yok edin.
Bu özel başvuru muteks nesnesini kullanıyor.
Böylece Mutex Destroyer'da bu isteğin uygulanması tamamlanır.
Bu API'yi, yalnızca uygulamanın tüm iş parçacıklarını kapattığından emin olunduğunda çağrılacak şekilde
çağırmak geliştiricinin sorumluluğundadır.
Tamam.
Bu özyinelemenin uygulanmasıydı, Murdoch bir sonraki derste dört API'yi de uyguladığımızı
söylüyor.
Özyinelemeli Maddox'ların kullanımını gösteren bir demo uygulama yazalım.