Как и в документации, исключение ApplicationException было вызвано тем, что поток, не принадлежащий мьютеку, попытался его освободить. Это не означает, что мьютекс был выпущен, только тот поток, который пытался его освободить, не обладал им.
var mutex = new Mutex();
mutex.WaitOne();
var thread = new Thread(() =>
{
try
{
mutex.ReleaseMutex(); //This will throw ApplicationException
}
catch (ApplicationException ex)
{
Console.WriteLine("Failed to release mutex");
}
});
thread.Start();
thread.Join();
mutex.ReleaseMutex(); //No exception will be thrown here
В этом примере начальная нить создает мьютекс и приобретает его. Второй поток будет развернут, попытается выпустить его и выйти из строя. После того, как он не удастся, личный поток освободит его.
Update
В вашем предыдущем вопросе, важно отметить, что вы работаете, что код с несколькими потоками, и что же состояние гонки присутствует в каждом потоке. Множественные потоки, возможно, не смогли получить мьютекс, пока один поток удерживается на нем, и поэтому несколько потоков также не смогут его освободить. В качестве примера возьмем следующий путь исполнения.
- Тема 1 получает мьютексы.
- Резьба 2 не может получить мьютексы, потому что у Thread 1 есть.
- Нить 3 не может получить мьютексы, потому что в ней есть 1.
- Тема 3 пытается освободить мьютекс, бросая исключение ApplicationException, потому что оно не принадлежит.
- Тема 1 выпускает мьютексы.
- Thread 2 пытается освободить мьютекс, выбросив исключение ApplicationException, потому что он не владеет им.
Тот факт, что тема 3 взорвали, когда он не смог освободить мьютекс не имеет никакой связи с тем, что тема 2 также взрывалась, делая то же самое.
Если вы можете выполнить код в моем предыдущем вопросе. U заметим, что исключение возникает в следующем потоке. – Shrikey
@Shrikey Обновлен мой ответ, чтобы ответить на ваш предыдущий код. –
Но если вы можете просто проверить вывод для кода. Исключение приложения не выбрасывается сразу же после того, как поток освобождает мьютекс, который его не владеет. Исключение задерживается :( – Shrikey