在多线程代码中,当一个实例可能被多个线程读取或写入时,需要锁定它们以安全地执行这些操作。在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