Ini tergantung pada bagaimana kunci diterapkan. Jika Anda melakukannya seperti pada artikel Wikipedia, yaitu menjaga bagian penting dengan satu boolean per proses¹, Anda tentu dalam masalah. Jika satu proses mati, ia tidak pernah mengatur ulang benderanya sehingga proses lainnya berulang selamanya.
Dalam praktiknya, Anda dapat melindungi kode Anda dari banyak cara kematian. Misalnya, ambil implementasi gaya Java ini:
flag[1] = true;
turn = 1;
while ( flag[0] == true && turn == 1 ) { Thread.yield(); }
try {
// critical section
}
finally {
flag[1] = false;
}
Ini akan memastikan bendera disetel ulang apa pun yang terjadi di bagian kritis, selama sistem menangani kesalahan. Di Jawa, itu benar bahkan untuk stack dan heap overflow. Jadi, kecuali proses itu benar-benar hilang ( kill
², kegagalan prosesor, putuskan jaringan, ...) Anda aman. Perhatikan bahwa sebagian besar perangkat lunak tidak penting gagal dalam kasus ini - bagaimana bisa menangani kesalahan itu tidak berjalan? - sehingga harus diterima dalam banyak kasus. Anda dapat menangani ketidakkonsistenan saat memulai ulang jika perlu.
Jika Anda menggunakan kunci tingkat bahasa yang tepat, sistem runtime dapat menangani menghilangnya pemilik kunci, yaitu melepaskan kunci dengan pemilik yang mati. Anda dapat mensimulasikan ini sendiri dengan memberikan setiap proses pergantian orang mati yang dapat dibaca orang lain, atau memeriksa secara langsung apakah proses kepemilikan kunci masih hidup (jika sistem mendukungnya).
- Lagipula itu tidak baik skala.
- Di Jawa, saya pikir
finalize
harus mengeksekusi bahkan kill
, tapi ini tidak dijamin oleh spek. kill -9
mungkin merupakan hukuman mati untuk solusi apa pun yang membutuhkan proses sekarat untuk melakukan sesuatu.