マルチスレッドの理解を固めようとしています。私は自分自身を教えるために最善を尽くしていますが、これらの問題のいくつかは明確にする必要があります.
コードの一部を 3 回繰り返し、ロックを試してみました。
このコードで、ロックが必要なのは this.managerThreadPriority だけです。
まず、最小限のロックを使用した単純な手続き型アプローチです。
var managerThread = new Thread
(
new ThreadStart(this.ManagerThreadEntryPoint)
);
lock (this.locker)
{
managerThread.Priority = this.managerThreadPriority;
}
managerThread.Name = string.Format("Manager Thread ({0})", managerThread.GetHashCode());
managerThread.Start();
次に、新しいスレッドを作成して起動する単一のステートメントですが、ロックの範囲が大きすぎて、スレッドの作成と起動を含めることができません。コンパイラは、 this.managerThreadPriority が使用された後にロックを解放できることを魔法のように知りません。
この種の素朴なロックは避けるべきだと思います。
lock (this.locker)
{
new Thread
(
new ThreadStart(this.ManagerThreadEntryPoint)
)
{
Priority = this.managerThreadPriority,
Name = string.Format("Manager Thread ({0})", GetHashCode())
}
.Start();
}
最後に、共有フィールドの周りにのみ「埋め込み」ロックを使用して、新しいスレッドを作成して起動する単一のステートメントです。
new Thread
(
new ThreadStart(this.ManagerThreadEntryPoint)
)
{
Priority = new Func<ThreadPriorty>(() =>
{
lock (this.locker)
{
return this.managerThreadPriority;
}
})(),
Name = string.Format("Manager Thread ({0})", GetHashCode())
}
.Start();
lock ステートメントのスコープについてコメントしますか? たとえば、if
ステートメントでフィールドを使用する必要があり、そのフィールドをロックする必要がある場合、ステートメント全体をロックしないようにする必要がありますif
か? 例えば
bool isDumb;
lock (this.locker) isDumb = this.FieldAccessibleByMultipleThreads;
if (isDumb) ...
対。
lock (this.locker)
{
if (this.FieldAccessibleByMultipleThreads) ...
}