一度だけ実行されるが、多くのシナリオで呼び出されるクリティカル セクションがあります。このスレッド プロシージャを実行し、残りのすべての呼び出しをスキップするにはどうすればよいですか?
前もって感謝します。
一度だけ実行されるが、多くのシナリオで呼び出されるクリティカル セクションがあります。このスレッド プロシージャを実行し、残りのすべての呼び出しをスキップするにはどうすればよいですか?
前もって感謝します。
// Assuming this uses calls from multiple threads, I used volatile.
volatile bool executed = false;
object lockExcecuted = new object();
void DoSomething()
{
lock (lockExecuted)
{
if (executed) return;
executed = true;
}
// do something
}
public static bool hasExecuted = false;
static readonly object lockObject = new object();
static void Method()
{
lock(lockObject)
{
if(!hasExecuted)
{
// run code
hasExecuted = true;
}
}
}
lock
クリティカル セクションへのアクセスを 1 つのスレッドのみに許可し、アクセスが完了すると完了を示すフラグを設定するために 使用します。
lock が推奨される方法です。より詳細な要件がない限り。
編集:「一度だけ」の追加は、ロックが不十分であることを意味します。
あなたのシナリオに依存します。このセクションが値を返す場合、.Net 4.0 の新機能 - Lazy(T)を使用できます。
もちろん、いつでもクリティカル セクション内にフラグを設定し、実行前にその値を確認することができます (これは、シングルトン パターンを使用している場合に行われることがあります)。