Mutex (потому что у него есть имя) остановит любой процесс на той же машине, к которому он также обращается, тогда как блокировка остановит только другие потоки в том же процессе. Из этого примера кода я не вижу, зачем вам нужны оба вида блокировки. Кажется хорошей практикой удерживать простую блокировку в течение короткого периода времени, но тогда гораздо более тяжелый межпроцессный мьютекс блокируется на возможно более длительный (хотя и частично совпадающий) период! Было бы проще просто использовать мьютекс. И, возможно, выяснить, действительно ли необходима межпроцессная блокировка.
Кстати, catch {}
- абсолютно неправильная вещь в этом сценарии. Вы должны использовать finally { /* release mutex */ }
. Они очень разные. Улов будет поглощать гораздо больше видов исключений, чем следовало бы, а также заставит вложенные обработчики finally выполнять в ответ на исключения низкого уровня, такие как повреждение памяти, нарушение доступа и т. Д. Поэтому вместо:
try
{
// something
}
catch
{}
// cleanup
Вы должны иметь:
try
{
// something
}
finally
{
// cleanup
}
И если есть конкретные исключения, из которых вы можете восстановиться, вы можете их перехватить:
try
{
// something
}
catch (DatabaseConfigurationError x)
{
// tell the user to configure the database properly
}
finally
{
// cleanup
}