Рассмотрим следующий код:
Названный мьютекса Cross Process Acquisition Заказать
private static void TestMutex()
{
var m = new Mutex(false, "TestYecMutex");
m.WaitOne();
Console.WriteLine("Here. Press key");
Console.ReadKey();
m.ReleaseMutex();
Console.WriteLine("Released\n\n");
m = new Mutex(false, "TestYecMutex");
m.WaitOne();
Console.WriteLine("Here. Press key");
Console.ReadKey();
m.ReleaseMutex();
Console.WriteLine("Released");
}
Он приобретает именованный мьютекс, освобождает его, получает его снова и снова релизы.
Я запускаю 3 экземпляра процесса с указанным выше кодом, например p1, p2 & p3 (который также является порядком, которым я их управлял).
Я ожидаю, что нажму на окно p1, и p2 приобретет замок, и после нажатия на p2, p3 затем приобретет его и вернется к p1 после нажатия на p3. Однако p1 приобрел, щелкнул, p1 освобожден и p2 приобрел, нажал на p2, и p1 (!!!) приобрел блокировку (а не p3, как и следовало ожидать).
Разве нет очереди того, кто следующий по очереди? Я также пробовал с семафором 1, таким же результатом.
Любые идеи?
Нет «следующего», у вас есть состояние гонки. –
Так что это какой-то механизм опроса? когда запрошен мьютекс и в настоящее время используется, процесс запроса будет опросить, пока он не станет бесплатным? Не лучше ли в этом случае очередь FIFO? –
В отличие от монитора объекта in-process, используемого в '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' Даже в рамках одного и того же процесса он не гарантированно будет цикличным и, конечно же, через процессы (т. Е. В именованном мьютексе), это не так. Предположительно, здесь у вас есть еще одна, более широкая цель; вы должны уточнить свой вопрос, чтобы объяснить, какой _end result_ вы действительно хотите. Возможно, будет какой-то альтернативный подход, который будет работать. –