잠금을 사용하는 것이 확실한 방법입니다.스레드 안전성 왼쪽 시프트
그러나 나는 C#에서 Interlocked
클래스가 있다는 것을 알고 있습니다. 이것은 스레드 안전 증가 및 감소에 좋기 때문에 왼쪽 시프트와 같은 이진 연산에 대해 동일한 작업을 수행 할 수 있는지 궁금합니다.
왼쪽 시프트 연산자에 대해 Interlocked
클래스가 있습니까?
잠금을 사용하는 것이 확실한 방법입니다.스레드 안전성 왼쪽 시프트
그러나 나는 C#에서 Interlocked
클래스가 있다는 것을 알고 있습니다. 이것은 스레드 안전 증가 및 감소에 좋기 때문에 왼쪽 시프트와 같은 이진 연산에 대해 동일한 작업을 수행 할 수 있는지 궁금합니다.
왼쪽 시프트 연산자에 대해 Interlocked
클래스가 있습니까?
당신이 교대를 떠나 할당하려고하는 가정, 그리고 당신이 충돌, 당신은 이런 식으로 뭔가를 할 수 싶지 않아 가정 : 자체
// this method will only return a value when this thread's shift operation "won" the race
int GetNextValue()
{
// execute until we "win" the compare
// might look funny, but you see this type of adjust/CompareAndSwap/Check/Retry very often in cases where the checked operation is less expensive than holding a lock
while(true)
{
// if AValue is a 64-bit int, and your code might run as a 32-bit process, use Interlocked.Read to retrieve the value.
var value = AValue;
var newValue = value << 1;
var result = Interlocked.CompareExchange(ref AValue, newValue, value);
// if these values are equal, CompareExchange peformed the compare, and we "won" the exchange
// if they are not equal, it means another thread beat us to it, try again.
if (result == value)
return newValue;
}
}
Interlocked 클래스의 메서드는 주로 C#에서 개별적인 연산자의 스레드 안전 버전을 제공하는 데 중점을 둡니다. 그것은 스레드 안전하지 않은 +=
과 ++
과 같은 연산자를위한 메소드를 가지고 있습니다.
<<
, =
및 +
과 같은 연산자는 이미 스레드로부터 안전하므로 Interlocked에는 이러한 메서드가 없습니다. 이러한 연산자를 다른 연산자 (예 : x = y + z
)와 결합하면 사용자가 직접 처리 할 수 있습니다.
왜'<<'는'++ '연산자보다 스레드 안전성이 더 좋은지 모르겠다 –
일단 할당을 추가하면 연산은 더 이상 원자 적이 지 않습니다. 'a = a << 1'은 확실히 원 자성이 아닙니다. 그래서 당신이 기술적으로 틀린 것은 아니지만 질문에 대답하지 않습니다. – CodesInChaos
@ArsenZahray :'++'는로드, 추가 및 저장을 모두 한 번에 수행하는 반면, << <<는로드 및 왼쪽 시프트 일뿐입니다. 결과를 저장하려면 다른 연산자와 결합해야합니다. – StriplingWarrior
왼쪽 시프트 연산자는 원자 작업입니다. 명확하게하기 위해 왼쪽 시프트하고 값을 할당하는 스레드로부터 안전한 방법을 요구하고 있습니까? 'x = x << y;', 맞습니까? – StriplingWarrior
증가량과 감소량도 마찬가지입니다. 하지만 여러 스레드로 값을 수정할 때, 그것은 올바르게 작동하지 않습니다. –
루프에서 항상 'Interlocked.CompareExchange'를 사용할 수 있습니다. – CodesInChaos