Bu, kilitlerin nasıl uygulandığına bağlıdır. Wikipedia makalesinde olduğu gibi yaparsanız, yani kritik bölümü işlem başına bir boole ile korumak¹, kesinlikle sorun yaşarsınız. Bir işlem ölürse, bayrağını asla sıfırlamaz, böylece diğer süreç sonsuza kadar döngüye girer.
Uygulamada, kodunuzu birçok ölüme karşı koruyabilirsiniz. Örneğin, şu Java tarzı uygulamayı alın:
flag[1] = true;
turn = 1;
while ( flag[0] == true && turn == 1 ) { Thread.yield(); }
try {
// critical section
}
finally {
flag[1] = false;
}
Bu, sistem hatayı ele aldığı sürece kritik bölümde ne olursa olsun bayrağın sıfırlandığından emin olur. Java'da, yığın ve yığın taşmaları için bile geçerlidir. İşlem tam anlamıyla kaybolmadıkça ( kill
², işlemci arızası, ağ bağlantısının kesilmesi, ...) güvendesiniz. Kritik olmayan yazılımların çoğunun bu durumlarda başarısız olduğunu unutmayın - çalışmadığı bir hatayı nasıl işleyebilir? - bu yüzden birçok durumda kabul edilmelidir. Gerekirse yeniden başlatma sırasında tutarsızlıkları kaldırabilirsiniz.
Dil düzeyinde uygun kilitler kullanırsanız, çalışma zamanı sistemi kaybolan kilit sahiplerini işleyebilir, yani ölü sahiplerle kilitleri serbest bırakabilir. Bunu, her bir sürece diğerlerinin okuyabileceği ölü bir adam anahtarı vererek kendiniz simüle edebilir veya kilit sahip olma sürecinin hala hayatta olup olmadığını doğrudan kontrol edebilirsiniz (sistem destekliyorsa).
- Bu zaten iyi ölçeklenmiyor.
- Java, ben
finalize
bile yürütmek gerektiğini düşünüyorum kill
, ama bu spec tarafından garanti değildir. kill -9
muhtemelen ölme sürecinin bir şey yapmasını gerektiren herhangi bir çözüm için ölüm cezasıdır.