Использование 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();
}
}
Ответы
Ответ 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;
Редактировать: спасибо комментаторам! Ситуации существуют, где блокировка (это) может быть опасной. Поэтому я удалил это.