1

一度だけ実行されるが、多くのシナリオで呼び出されるクリティカル セクションがあります。このスレッド プロシージャを実行し、残りのすべての呼び出しをスキップするにはどうすればよいですか?

前もって感謝します。

4

5 に答える 5

5
// 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
}
于 2012-05-15T15:43:41.110 に答える
1
public static bool hasExecuted = false;

static readonly object lockObject = new object();

static void Method()
{
    lock(lockObject)
    {
        if(!hasExecuted)
        {
            // run code
            hasExecuted = true;
        }
    }
}
于 2012-05-15T15:46:53.833 に答える
0

lockクリティカル セクションへのアクセスを 1 つのスレッドのみに許可し、アクセスが完了すると完了を示すフラグを設定するために 使用します。

于 2012-05-15T15:44:11.233 に答える
0

lock が推奨される方法です。より詳細な要件がない限り。

編集:「一度だけ」の追加は、ロックが不十分であることを意味します。

于 2012-05-15T15:43:20.590 に答える
0

あなたのシナリオに依存します。このセクションが値を返す場合、.Net 4.0 の新機能 - Lazy(T)を使用できます。

もちろん、いつでもクリティカル セクション内にフラグを設定し、実行前にその値を確認することができます (これは、シングルトン パターンを使用している場合に行われることがあります)。

于 2012-05-15T15:46:58.363 に答える