をので、要件は以下のとおりです。スレッドはそれが必要false
値を見れば
- 複数のスレッドが単一
bool
変数
- を読みますスレッドが
true
値を見ているならば、他に何もする必要があります
- スレッドを1つだけ起こるべきではない、追加の作業
- を
true
に変更し、実行します値を変更するので、コードは次のようになり、追加の作業
を実行するBLE:
public class Example
{
private bool b = false;
public void DoSomething()
{
if (!b)
{
b = true;
DoExtraStuff();
}
}
}
これがDoSomething
を実行する複数のスレッドがあるとの意図があることであれば、当然のことながら、安全ではありませんDoExtraStuff
は一度だけ実行してください。問題は、スレッドがb
の読み取りと書き込みで競合することです。
実際には、読み書きをb
アトミックにする必要があります。これはlock
キーワードを使用して行うことができます。
public class Example
{
private bool b = false;
private object locker = new object();
public void DoSomething()
{
bool trigger = false;
lock (locker)
{
if (!b)
{
b = true;
trigger = true;
}
}
if (trigger)
{
DoExtraStuff();
}
}
}
Interlocked.CompareExhange
介しCAS操作を使用して、代替のパターンがあります。残念ながら、bool
を受け入れる過負荷はありませんが、bool
をint
に変更する場合は、次のようにも動作します。
public class Example
{
private int b = 0;
public void DoSomething()
{
if (Interlocked.CompareExchange(ref b, 0, 1) == 0)
{
DoExtraStuff();
}
}
}
これはどの言語ですか? – Tudor