マルチスレッド実行コンテキストがあります。1つのリソース(たとえばオブジェクトr)を相互に排他的にしたいと思います。リソース自体をモニターオブジェクトとして使用できますか?
例えば
lock(r)
{
// do something...
}
マルチスレッド実行コンテキストがあります。1つのリソース(たとえばオブジェクトr)を相互に排他的にしたいと思います。リソース自体をモニターオブジェクトとして使用できますか?
例えば
lock(r)
{
// do something...
}
全体を通して同じオブジェクトのままである場合r
-たとえば、複数のスレッドからアイテムを追加している場合r
:List
lock (r)
{
r.Add("Hello world");
}
そうすれば、これは問題ありません。問題は発生しません。具体的に「ロックr
」しているので、読むことができます。(使用している他のコードのlock
周りにも同様のものを配置するようにしてください。)r
ただし、:r
内の別のオブジェクトに切り替えられている場合lock
lock (r)
{
r = new List<string>();
}
これは良い考えではありませんlock
。2つの異なるバージョンに対して2つのスレッドが実行される可能性があるためですr
。この場合、object
特にロックするために不変のものを作成する必要があります。つまり、「ロック」よりも「コードブロックr
をロック」する必要があります。