マルチスレッド環境で共有変数にアクセスするコードがいくつかあります。明らかにlock
これらのアクセスのために必要ですが、私の質問は、値を取得するために短時間変数をロックし、ロックを解除し、取得したものでいくつかのことを行い、次に変更するために再度ロックすることで、追加のオーバーヘッドを節約または作成するかどうかです。ロックを解除したばかりのデータ構造。
ロックの外で実行できる非常にコストのかかる操作の場合は、明らかに、そのセグメントをロックしないことでメリットが得られます。たとえば、実行される操作が比較的安価な場合 (new object
とを作成if statement
)は次のようになります。
ねじれが少ない:
Value v;
lock (values)
{
v = values.FirstOrDefault(a => a.Thing == someValue);
if (v == null)
{
v = new Value { Thing = someValue };
values.Add(v);
}
}
よりスレッド:
Value v;
lock (values)
{
v = values.FirstOrDefault(a => a.Thing == someValue);
}
if (v == null)
{
v = new Value { Thing = someValue };
lock(values)
{
values.Add(v);
}
}
どちらのソリューションもスレッドセーフであり、どちらも非常に読みやすい (IMHO) ですが、2 つにわずかな違いがある場合でも、より効率的な方を習慣に組み込むとよいでしょう。