(Ответ полностью переписан, старый ответ внизу)
Обычно System.Threading.Mutex используется для межпроцессного взаимодействия.Если вы просто хотите синхронизировать свои потоки в рамках одного и того же процесса, использование Mutex с полным весом является излишним.Вы можете использовать любой объект с оператором lock
:
Class ThreadClass
{
// static is important, this way the object is shared among all
// class instances
private static object myMutex = new object();
public ThreadFunction()
{
// Wait until it is safe to enter.
lock(myMutex)
{
// critical code
}
// the mutex is automatically released after leaving the block.
}
}
Class MotherClass
{
ThreadClass one = new ThreadClass(); // first instance
Threadclass two = new ThreadClass(); // second instance
// Assign the Thread function to run on separate Thread
}
Преимущество lock
-approach заключается в возможности быстрого возврата и безопасности исключений (представьте, что произойдет, если критический код выдает исключение;но посмотрите на статью Эрика Липперта об исключениях при блокировке ).
Если метод целом является критическим, и не более критических методовв классе вы можете сделать это еще проще:
Class ThreadClass
{
[MethodImpl(MethodImplOptions.Synchronized)]
public ThreadFunction()
{
// critical code
}
}
Class MotherClass
{
ThreadClass one = new ThreadClass(); // first instance
Threadclass two = new ThreadClass(); // second instance
// Assign the Thread function to run on separate Thread
}
(Старый ответ здесь сохраняется для согласованности)
Все экземпляры класса передаются по ссылке в C #.Если ваш Mutex является классом (например, это System.Threading.Mutex
), он будет автоматически передан по ссылке.
Смотрите здесь для получения дополнительной информации.
Исправление:
Как правильно говорит @Guffa, вы не передаете экземпляр класса по ссылке, а ссылку на экземпляр класса по значению (если не используете * 1035)* ключевое слово).На самом деле это почти то же самое.Разница в том, что изменения в переданной ссылке не видны за пределами вызываемого абонента.