在多線程代碼中,當一個實例可能被多個線程讀取或寫入時,需要鎖定它們以安全地執行這些操作。在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