Ответ на вопрос
AFAIK такого класса Mutex не существует. AbandonedMutexException довольно раздражает, но представляет реальную ситуацию, для которой не существует автоматического решения.
Если у вас кросс-процессный или даже кросс-поточный обмен данными, вы должны учитывать тот факт, что любая из участвующих сторон может быть неожиданной и внезапно прерванной по любому числу причин. Mutex существует для защиты ресурсов, если поток, в котором он находится, хранится в Mutex, у ОС нет никакого способа гарантировать, что он оставит данные любым согласованным образом. Это очень важно, потому что это означает, что отказ от потока может сделать недействительными определенные инварианты, от которых зависят другие потоки.
AbandonedMutexException - это способ предупреждающего предупреждения "случилось что-то плохое, и теперь вы находитесь в неопределенном состоянии". Других ресурсов для операционной системы здесь нет.
Ответ на ваш ответ
EventWaitHandle отличается от Mutex и служит различным целям.
Mutex используется для защиты определенного ресурса, очень похожего на оператор блокировки. Когда конкретный поток приобретает мьютекс, говорят, что он владеет мьютексом. Там может быть только один владелец одновременно. Поэтому, если все участвующие потоки соглашаются касаться ресурса только тогда, когда они владеют Mutex, вы можете безопасно обращаться к ресурсу через поток.
EventWaitHandle можно до некоторой степени визуализировать как потокобезопасное событие. Он имеет концепцию сигнализируемого и не сигнализируемого, и любое количество потоков может ожидать его попадания в сигнальное состояние. Когда это сигнализируется, один из ожидающих потоков проснется и начнет обработку.
Вы можете использовать EventWaitHandle для реализации формы безопасности потоков. Вместо владения блокировкой, являющейся ключом к доступу к ресурсу, сигнал от события является ключом к доступу к ресурсу. Однако дьявол снова в деталях.
- Кто отвечает за оповещение о событии? С мьютексом каждый поток по сути кричит "me me me", и ОС выбирает один поток, чтобы выиграть. С EventWaitHandle вы будете нести ответственность за решение, когда следующий поток будет запущен.
- Что происходит, когда кто-то убивает процесс с помощью taskmgr? Что, если уничтоженный процесс имеет поток, в настоящее время отвечающий на событие в EventWaitHandle?
2, но что произойдет, когда предмет, который будет сигнализировать о ручке ожидания, будет снят? Вы должны учитывать это, чтобы избежать тупика.