2012-05-01 5 views
1

«Класс Mutex обеспечивает соблюдение идентичности потоков, поэтому мьютекс может быть освобожден только поток, который приобрел его. Напротив, класс Семафор не обеспечивает идентичность потока.»Освобождение мьютекса.

Это то, что говорит MSDN описание .. Но в соответствии с моим вопросом Application exception is thrown, я попытался выпустить мьютекс, даже когда я его не получаю. Он показал мне исключение, когда выполняется следующий поток. Означает ли это, что поток, который не имеет доступа к мьютексу, выпустил его ??? Может кто-то, пожалуйста, помогите мне в понимании этой концепции и, пожалуйста, направляйте меня, если я сделал что-то неправильно.

ответ

1

Как и в документации, исключение 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 также взрывалась, делая то же самое.

+0

Если вы можете выполнить код в моем предыдущем вопросе. U заметим, что исключение возникает в следующем потоке. – Shrikey

+0

@Shrikey Обновлен мой ответ, чтобы ответить на ваш предыдущий код. –

+0

Но если вы можете просто проверить вывод для кода. Исключение приложения не выбрасывается сразу же после того, как поток освобождает мьютекс, который его не владеет. Исключение задерживается :( – Shrikey

0

Что касается концепции мьютекса, вы можете представить ее как ящик и поток, которому принадлежит мьютекс, как человек, который держит ключ от этого ящика. Только тот, кто держит ключ в ящике, может разблокировать его, поэтому только поток, который приобрел мьютекс, может его освободить.

Когда вы пытаетесь выпустить мьютекс из потока, который не имеет мьютекса, это похоже на то, что кто-то пытается открыть чей-то ящик с помощью поддельного ключа, поэтому исключение бросают, чтобы поймать грабителя!

Это все мьютекс, он предотвращает выполнение несколькими потоками «защищенного кода» (внутри ящика). Его название происходит от «взаимного исключения», что означает один поток за раз.

Смежные вопросы