POSIX, mutekslerin özyinelemesine izin verir. Bu, aynı iş parçacığının aynı muteksi iki kez kilitleyebileceği ve kilitlenmeyeceği anlamına gelir. Tabii ki aynı zamanda iki kez kilidini açması gerekiyor, aksi takdirde başka hiçbir iplik muteksi elde edemez. Pthreads'i destekleyen tüm sistemler özyinelemeli muteksleri de desteklemez, ancak POSIX uyumlu olmak istiyorlarsa, yapmak zorundadırlar .
Diğer API'ler (daha yüksek seviye API'ler) genellikle genellikle Kilitler olarak adlandırılan muteksler sunar. Bazı sistemler / diller (örn. Cocoa Objective-C) hem yinelemeli hem de yinelemesiz muteksler sunar. Bazı diller de yalnızca birini veya diğerini sunar. Örneğin, Java muteksleri her zaman özyinelemelidir (aynı iş parçacığı aynı nesne üzerinde iki kez "eşitlenebilir"). Sundukları diğer iplik işlevselliğine bağlı olarak, kendiniz kolayca yazılabildikleri için özyinelemeli mutekslere sahip olmak sorun olmayabilir (daha basit muteks / koşul işlemleri temelinde kendimde yinelenen muteksler uyguladım).
Ne anlamıyorum: Özyinelemeli muteksler ne işe yarar? Aynı muteksi iki kez kilitlerse neden bir iplik kilitlenmesi olmasını isterim? Bundan kaçınabilecek üst düzey diller bile (örneğin, bunun kilitlenip kilitlenmeyeceğini test etmek ve eğer bir istisna atmak) genellikle bunu yapmaz. Bunun yerine ipliğin kilitlenmesine izin verecekler.
Bu sadece yanlışlıkla iki kez kilitlediğim ve sadece bir kez kilidini açtığım durumlar için mi ve özyinelemeli bir muteks durumunda, sorunu bulmak daha zor olurdu, bu yüzden bunun yerine yanlış kilidin nerede göründüğünü görmek için hemen kilitlenme var mı? Ama kilidini açarken kilit sayacı döndürmekle aynı şeyi yapamadım ve son kilidi açtığımdan ve sayacın sıfır olmadığından emin olduğum bir durumda, bir istisna atabilir veya sorunu kaydedebilir miyim? Ya da göremediğim özyineli olmayan mutekslerin başka, daha kullanışlı bir kullanım durumu var mı? Veya özyinelemesiz bir muteks özyinelemeli olandan biraz daha hızlı olabileceğinden, sadece performans mıdır? Ancak, bunu test ettim ve fark gerçekten büyük değil.