여러 스레드에서 다음 코드를 호출하려고합니다.lock 문을 사용하지 않고 코드를 스레드로 안전하게 작성
// x is a global/member and initialized to 0
if (Interlocked.Increment(ref x) == 2)
{
// do something only once
}
이 스레드 안전하지 물론이다 : 런타임에 첫 번째 스레드가 x
이 증가 된 후 중지하지만, 평가하기 전에, 다음 두 번째 스레드 단위 x
그래서 그 다음, 지금 if
문 2 경우 true
입니다. 그런 다음 첫 번째 스레드로 돌아가서 if
문에서도 마찬가지입니다.
이 코드는 lock
문으로 둘러 쌀 수 있습니다.
lock
문을 사용하지 않고 스레드를 안전하게 만들 수있는 방법이 있습니까?
Interlocked.Increment() 메소드의 반환 값을 다른 스레드가 변경할 수 없기 때문에 설명 된 시나리오가 발생하지 않습니다. – dymanoid
나중에 * x에 다시 액세스하여 증가 값과 같다고 가정하면 코드가 * 안전하지 않을 수 있지만이 문제를 보여주는 코드는 여기에 표시되지 않았습니다. –