문제

예를 들어, 잠금해야합니까? bool 멀티 스레딩시 가치?

도움이 되었습니까?

해결책

원자와 같은 것은 없습니다 유형. 뿐 운영 원자 일 수 있습니다.

단일 단어로 맞는 데이터 유형을 읽고 쓰기 (int 32 비트 프로세서에서 long 64 비트 프로세서에서)는 기술적으로 "원자"이지만 지터 및/또는 프로세서는 지침을 재정렬하여 예기치 않은 레이스 조건을 만들기로 결정할 수 있으므로 lock, 사용 Interlocked 쓰기 (및 경우에 따라 읽기)에 대한 클래스 또는 변수를 선언합니다. volatile.

짧은 대답은 다음과 같습니다. 두 개의 다른 스레드가 동일한 필드/변수에 액세스 할 수 있고 그 중 하나 이상이 글을 쓰면 일종의 잠금을 사용해야합니다. 일반적으로 원시 유형의 경우 Interlocked 수업.

다른 팁

비슷한 질문 여기

결정적인 대답은 사양으로 이동하십시오. :)

CLI 사양의 파티션 I, 섹션 12.6.6은 다음과 같이 말합니다. . "

따라서 s_initialized는 결코 불안정하지 않을 것이며, Primitve 유형에 읽고 쓰는 것은 원자임을 확인합니다.

인터 로킹은 프로세서가 읽기 및 쓰기를 재정렬하는 것을 방지하기 위해 메모리 장벽을 만듭니다. 잠금은이 예에서 필요한 장벽을 만듭니다.

남자.

본질적으로, 당신은 bool을 잠그지 않아 "충돌"문제가 없습니다. 당신이 가질 수있는 것은 bool이 업데이트되거나 읽는 순서의 경주 조건입니다. Bool이 특정 순서로 작성/읽은 것을 Garuntee로 원한다면 일종의 잠금 메커니즘을 사용하고 싶을 것입니다.

일종의. 이것에 대한 훌륭한 스레드가 있습니다 여기, 그러나 짧은 버전은 주어진 읽기 또는 쓰기가 원자 일 수 있지만 거의하지 않는 일이 아닙니다. 예를 들어, 정수를 증가 시키려면 1) 값을 읽고, 2) 값을 추가하고 3) 값을 다시 저장하십시오. 이러한 작업 중 하나는 중단 될 수 있습니다.

이것이 "인터 로크"와 같은 수업의 이유입니다.

정적 원시 유형은 나사산이므로 유형 변수를 잠글 필요가 없습니다. 그러나 원시 유형의 인스턴스 변수는 보장되지 않습니다. 여기를 봐: Primitive 유형은 Bool ThreadSafe와 같은입니까?

MSDN PrimitiveType 클래스

그리고 다음은 솔루션이 매우 설득력있는 것에 관심이있는 또 다른 유용한 링크입니다. 따라서 질문 : C# 메소드가 스레드 안전인지 어떻게 알 수 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top