2013-05-13 2 views
2

여러 스레드가 하나의 정적 컨테이너 (boost :: unordered_map)에 액세스하는 경우 컨테이너에 대한 액세스를 잠글 필요가 없다고 가정하는 것이 안전하다는 것을 알고 싶습니다. 여러 스레드 그것으로부터 데이터를 읽는 것뿐입니다. 쓰기가 수행되지 않습니다.읽기 전용으로 잠글 필요가 있습니까?

답변

7

여러 스레드가 읽기 작업 만 수행하고 쓰기 작업을 수행하지 않는 경우 액세스를 동기화 할 필요가 없습니다.

문단 C++ 11 표준 1.10 데이터 경주에 대해 충돌하는 작업과 같이 정의 :

두 표현 중 하나가 메모리 위치 (170)이고 다른 하나 액세스를 수정하는 경우 평가 충돌 동일한 메모리 위치를 수정합니다. 1.10/21 당 물론 다음

그리고, : 그것은 다른 스레드에 두 개의 상충되는 행동을 포함하는 경우

프로그램의 실행이 데이터 경주을 포함,의 적어도 하나는 원자도 아니고, 다른 것보다 먼저 일어나지도 않는다. [...]

+0

정적 컨테이너를 초기화 한 후에는 추가 안전을 위해 차단 작업을 수행 할 수 있습니다. –

+0

또한 "읽기"가 컨테이너의 내부 상태를 변경하지 않는지 확인하십시오 (unordered_map 및 대부분의 경우이를 수행하지 않는 경우가 많으므로 특수 컨테이너가 내부 캐시를 수정하거나 자주 사용하는 항목의 조회 최적화를 위해 요소의 순서를 수정할 수 있음) – josefx

+2

@josefx : 만약 그렇다면, 나는 그것이 컨테이너 자체에 의해 동기화되기를 기대합니다. C++ 11 이후로 표준 라이브러리 유형에서 사용되는 라이브러리 객체 및 객체에 대한'const' 연산은 스레드로부터 안전해야합니다 ([this] (http://channel9.msdn.com/posts/C-and-Beyond-2012) 참조). -Herb-Sutter-You-dont-know-blank-and-blank)). 'boost :: unordered_map'은'std :: unorderded_map'에 영감을 주었기 때문에 그렇지 않다면 매우 놀랍습니다. –

관련 문제