Я запустил приведенный ниже код, ожидая, что поток будет заблокирован во второй раз, когда я заблокирую мьютекс. Запустив его дважды, я понимаю, что он может блокироваться много раз (при условии, что в одном и том же потоке) без остановки. Как изменить это поведение?
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace Test {
class Program {
static volatile Mutex mut1 = new Mutex();
static volatile Mutex mut2 = new Mutex();
static void Main(string[] args) {
mut1.WaitOne(); Console.WriteLine("1W");
mut2.WaitOne(); Console.WriteLine("2W");
Thread oThread = new Thread(new ThreadStart(fn2));
oThread.Start();
mut1.WaitOne(); Console.WriteLine("1W");
Console.WriteLine("Second");
mut1.ReleaseMutex(); Console.WriteLine("1R");
}
static void fn2() {
Console.WriteLine("First");
mut2.ReleaseMutex(); Console.WriteLine("2R");
mut1.ReleaseMutex(); Console.WriteLine("1R");
}
}
}
critical sectionsбыли небольшой вариацией мьютексов, но, проверив, версия критических секций Windows также является рекурсивной. - person Pascal Cuoq   schedule 13.12.2009