Подтвердить что ты не робот

Использование Mutex в С#

Я немного новичок в потоковом в С# и на общем, в моей программе я использую mutex, чтобы разрешить только 1 поток попасть в критическую секцию и по неизвестной причине делать некоторые cw-отпечатки. Я вижу, что в моем критическом разделе попадает больше 1 потока, и это мой код:

Mutex m = new Mutex();
m.WaitOne();
<C.S> // critical section here
m.ReleaseMutex();

Я очень хотел бы знать, если я делаю ошибку здесь заблаговременно за вашу любезную помощь.

EDIT:

Мой код включает классы, поэтому в основном это выглядит больше:

public class test
{
    private mutex m;
    public test()
    {
         m = new mutex();
    }
    public func()
    {
         m.WaitOne();
         <C.S> // critical section here
         m.ReleaseMutex();
     }


    } 
4b9b3361

Ответ 1

Проблема заключается в том, что все ваши вызывающие пользователи используют другой мьютекс; вам нужно, чтобы объект блокировки был общим, обычно создавая его поле. Например, и перейдем к более простой метафоре lock:

private readonly object syncLock = new object();
public void ThreadSafeMethod() {
    lock(syncLock) {
        /* critical code */
    }
}

или с использованием мьютекса:

private readonly Mutex m = new Mutex();
public void ThreadSafeMethod() {
    m.WaitOne();
    try {
        /* critical code */
    } finally {
        m.ReleaseMutex();
    }
}

Ответ 2

Похоже, вы даете каждой теме свой собственный Mutex. Это не сработает.

И в большинстве ситуаций Mutex переполняется. Вам нужно только:

private static object syncLock = new object();  // just 1 instance

....

lock(syncLock)
{
    // critical section
}

Ответ 3

Этот шаблон вообще не блокирует. Каждый поток создает новый объект Mutex и сразу владеет блокировкой для него. Другие потоки создают и используют новый Mutex.

Рассмотрите возможность использования регулярной блокировки()!

lock(_lockobject) {
   // do inside what needs to be done - executed on a single thread only
} 

где _lockobject - это простая личная переменная в вашем классе:

private object _lockobject; 

Редактировать: спасибо комментаторам! Ситуации существуют, где блокировка (это) может быть опасной. Поэтому я удалил это.