을 그래서 요구 사항은 다음과 같습니다 쓰레드가이해야 false
값을 보는 경우
를 값을 변경하고 수행 할 BLE 그래서 코드가 보일 것이다 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