Şimdi muteksleri kullanarak iş parçacığı senkronizasyonu uygularken aklınızda bulundurmanız gereken bazı muteks
kilitleme kurallarını tartışalım.
Dolayısıyla ilk kural, t1 iş parçacığı m muteksini kilitliyorsa, muteksin kilidini açması gerekenin yalnızca t1 iş
parçacığı olduğunu söyler.
Doğru.
Eğer t1 iş parçacığı muteksi kilitlerse, başka hiçbir iş parçacığı t1 iş parçacığı adına bu muteksin kilidini açamaz.
Doğru kilitleyen muteksin kilidini açması gereken aynı iş parçacığıdır.
İkinci kural, T1'in zaten kilidi açılmış bir murex'in kilidini açamayacağını söyler.
Doğru.
Bu tanımlanmamış bir davranışa yol açacaktır.
Programınızda zaten kilidi açık durumda olan bir muteksin kilidini açmaya çalışmamanız
gerekir.
Değil mi?
Bu, program kod akışınızın hatalı olduğu ve hata ayıklamanız gerektiği anlamına gelir.
Üçüncü kural, t1 iş parçacığı m muteksini kilitlerse, sürecin diğer iş parçacıklarının, örneğin T2 ve T3'ün, zaten
kilitli olan muteksi kilitlemeye çalışırlarsa engelleneceğini söyler.
Doğru.
Bu konuyu oldukça detaylı bir şekilde tartıştık.
Dördüncü maddeye göre, T1 ve T2 iş parçacığı zaten kilitli olan muteks m üzerinde bir kilit elde etmek için engellenirse,
işletim çizelgeleme politikası muteks m'nin kilidi sahibi tarafından açıldığında T1 veya T2 arasından hangi iş parçacığının
muteks m üzerindeki kilidi elde edeceğine karar verecektir.
Doğru.
Dolayısıyla, engellenmiş durumda olan iki iş parçacığı T1 ve T2 varsa ve bu iki iş parçacığı neden engellenmiş
durumdaysa, çünkü zaten kilitli olan muteks üzerinde bir kilit elde etmeye çalışıyorlar.
M Doğru, şimdi zaten kilitli olan bu muteks sahibi iş parçacığı tarafından açıldığında, T1 ve T2 arasında hangi iş
parçacığına muteks üzerinde kilit hakkı verilecek?
M Cevap, işletim sistemi zamanlama politikasına bağlı olduğudur.
Doğru.
Daha sonra tehdit muteksi iki kez kilitlemeye çalışırsa, kendi kendine kilitlenecektir.
Bu noktayı anlamak için, süreçte ve bu iş parçacığının yürütme akışında bir t iş parçacığınız olduğunu
varsayalım.
Diyelim ki p noktasında iş parçacığınız m muteksini kilitledi.
Doğru.
Peki, tamam.
İş parçacığınız muteksi kilitledi.
M.
Şimdi yine, yürütme akışının bir noktasında P1 iş parçacığınız yine muteks m'yi kilitlemeye çalışır.
Şimdi bu yanlış bir şey mi?
İş parçacığınız zaten kilitli olan muteksi kilitlemeye çalışırsa, iş parçacığınız kilitlenme durumuna geçecektir.
Bu durumda, iş parçacığınız zaten kendisi tarafından kilitlenmiş olan muteksi kilitlemeye çalıştığı için kendi
kendini kilitleme durumuna girmektedir.
Doğru.
Yani P1 noktasında iş parçacığınız kilitlenme durumuna geçecektir.
Bu yüzden benim tavsiyem, küçük küçük programlar yazmaya çalışmanız ve yukarıdaki beş noktayı doğrulamanızdır.
Değil mi?
Ve son kural Mutekslerin seviye sırasına göre açılması gerektiğini söylüyor.
Peki şimdi bu ne anlama geliyor?
Bu noktayı tekrar anlamak için, bir t iş parçacığınız olduğunu ve p noktasında iş parçacığınızın
muteksi kilitlediğini varsayalım.
Doğru ve p noktasında iş parçacığının mutex m2'yi kilitlediğini varsayalım.
Doğru.
Şimdi t iş parçacığınız kritik bölümle işini bitirdiğinde, mutekslerin kilidini sol sırayla açmalıdır.
Bu, p üç noktasında t iş parçacığının m2 muteksinin kilidini açması gerektiği anlamına gelir.
Doğru.
Ve sonra p dört noktasında iş parçacığınız muteks m1'in kilidini açmalıdır.
Bu yüzden muteksler kilitlendikleri sıranın tersi ile açılmalıdır.
Bu nedenle, çok iş parçacıklı programlarınızda muteksleri kullanırken, lütfen bu noktaları aklınızda bulundurun.