マルチスレッドコードでは、インスタンスが複数のスレッドによって読み取りまたは書き込みされる可能性がある場合、これらの操作を安全に実行するには、インスタンスをロックオンする必要があります。
ロックするオブジェクトの作成とコードによる一連のロックステートメントの記述の繰り返しを避けるために、ロックを処理するジェネリッククラスを作成しました。
概念的に、私は何かが欠けていますか?これはうまくいくはずですよね?
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);