2010-05-09 14 views
12

2 개 다른 스레드 갖는 않습니다 C#을 배열 (예를 들어 제 1 위치에서) 행
스레드 안전

  • 하나 개 독서
  • 같은 C# 1 배열되지만 쓰는 다른 것을 다른 위치 (예 : 마지막 위치까지)

은 스레드로부터 안전합니까?
(여기에는 읽거나 쓰지 않고 잠금 장치가 없습니다.)

답변

8

이 특별한 경우는 안전합니다. 예.

배열의 다른 부분을 읽고 쓰는 것이 다른 작업을 방해하지 않습니다.

그러나 같은 위치에서 읽고 쓰는 것은 요소의 유형과 요소의 크기에 따라 문제를 일으킬 수 있습니다.

+1

해당 항목이 별도의 CPU 단어 인 경우 – Stewart

+0

+1이 스레드가 안전하지 않다고 생각하지는 않지만 이유는 무엇인지 이해합니다. 감사! –

+0

"동일한 위치"라고 생각하는 것이 CPU가 동일한 위치로 생각하는 것과 같은 것이 아닌 잠금없는 알고리즘을 사용할 때 고려하는 것이 중요합니다. CPU의 메모리 뷰는 C와 같은 뷰 언어와 매우 다르다. 바이트가 어디에 주소를 차지하는지 알려준다. 일부 데이터 유형의 일부 CPU 아키텍처 (특히 ARM, Power)에서는 안전하지 않을 수도 있습니다. – Stewart

5

단편 : 예. 그것의 2 개의 다른 위치, 그것의 안전한 가동에 한.

잠시 전에 discussion about this 명이 있었는데, 궁금한 사항이 있으면 유용한 정보가 있습니다.

+0

+1이 스레드가 안전하지 않다고 생각하지는 않지만 그 이유를 이해합니다. 감사! –

7

안전성이 보장되지 않습니다. 당신이 byte []를 가지고 있다고 상상해보십시오. 이러한 바이트는 메모리에 밀집되어 있습니다. 이제 이러한 바이트를 수정하면 컴파일러가 일부 쓰기 작업을 병합하여 워드 (32 비트) 크기의 읽기 수정 쓰기 작업을 수행 할 수 있습니다. 예를 들어 ARM과 같은 일부 CPU에서는 컴파일러가 가지고있는 유일한 메모리 수정 명령어입니다. 한 번에 두 개 이상의 바이트를 수정하는 경우 특히 유용합니다. CPU도 똑같은 일을 할 수 있습니다. 또한 그것에 대해 모르는 사이에 물건을 재정렬 할 수 있습니다. 이런 종류의 최적화에도 불구하고 인접 메모리를 읽는 스레드가 부분 수정을 볼 수 있습니다. 힙 할당자가 당신에게 좋고 항상 적어도 단어 정렬 된 메모리를 제공하기 때문에 이런 종류의 효과를 정상적으로 보지 못한다.

+1

+1 : 제 의견으로는 이것이 최고의 대답입니다. 항상 잠금 해제 스레딩 관용구에 회의적인 것이 가장 좋습니다. 스레드가 다른 배열 위치로 작업하고 있어도 문제를 일으킬 수있는 모든 종류의 메모리 장벽 문제를 생각해 볼 수 있습니다. 확실한 답을 내기에는 질문에 제공된 정보가 충분하지 않습니다. –