В многопоточном коде, когда экземпляр может быть прочитан или написан несколькими потоками, их необходимо заблокировать для безопасного выполнения этих операций.Сделать блокировку проще в MTA
Чтобы избежать повторения создания объекта для блокировки и записи множества операторов блокировки через код, я создал общий класс для обработки блокировки.
Я пропустил что-нибудь, концептуально? Это должно работать, не так ли?
public class Locked<T> where T : new()
{
private readonly object locker = new object();
private T value;
public Locked()
: this(default(T))
{ }
public Locked(T value)
{
this.value = value;
}
public T Get()
{
lock (this.locker)
{
return this.value;
}
}
public void Set(T value)
{
lock (this.locker)
{
this.value = value;
}
}
}
И пример этого используется в классе:
private Locked<bool> stopWorkerThread = new Locked<bool>();
public void WorkerThreadEntryPoint()
{
while (true)
{
if (this.stopWorkerThread.Get())
{
break;
}
Кроме того, как бы я проверить что-то вроде этого, в автоматическом режиме (например, создать модульный тест)?
И наконец, что я могу сделать, чтобы реализовать ++ и - оператор, чтобы избежать этого:
this.runningThreads.Set(this.runningThreads.Get() + 1);
Пример кода не будет работать, если заблокированной (например) был объявлен в другом месте и повторно используется для всех абонентов - в противном случае у каждого вызывающего абонента есть другая блокировка, которая побеждает цель. И тогда было бы проще просто объявить объект и заблокировать (obj) –
2008-10-05 08:29:38