2
여러 스레드가 하나의 정적 컨테이너 (boost :: unordered_map)에 액세스하는 경우 컨테이너에 대한 액세스를 잠글 필요가 없다고 가정하는 것이 안전하다는 것을 알고 싶습니다. 여러 스레드 그것으로부터 데이터를 읽는 것뿐입니다. 쓰기가 수행되지 않습니다.읽기 전용으로 잠글 필요가 있습니까?
여러 스레드가 하나의 정적 컨테이너 (boost :: unordered_map)에 액세스하는 경우 컨테이너에 대한 액세스를 잠글 필요가 없다고 가정하는 것이 안전하다는 것을 알고 싶습니다. 여러 스레드 그것으로부터 데이터를 읽는 것뿐입니다. 쓰기가 수행되지 않습니다.읽기 전용으로 잠글 필요가 있습니까?
여러 스레드가 읽기 작업 만 수행하고 쓰기 작업을 수행하지 않는 경우 액세스를 동기화 할 필요가 없습니다.
문단 C++ 11 표준 1.10 데이터 경주에 대해 충돌하는 작업과 같이 정의 :
두 표현 중 하나가 메모리 위치 (170)이고 다른 하나 액세스를 수정하는 경우 평가 충돌 동일한 메모리 위치를 수정합니다. 1.10/21 당 물론 다음
그리고, : 그것은 다른 스레드에 두 개의 상충되는 행동을 포함하는 경우
가프로그램의 실행이 데이터 경주을 포함,의 적어도 하나는 원자도 아니고, 다른 것보다 먼저 일어나지도 않는다. [...]
정적 컨테이너를 초기화 한 후에는 추가 안전을 위해 차단 작업을 수행 할 수 있습니다. –
또한 "읽기"가 컨테이너의 내부 상태를 변경하지 않는지 확인하십시오 (unordered_map 및 대부분의 경우이를 수행하지 않는 경우가 많으므로 특수 컨테이너가 내부 캐시를 수정하거나 자주 사용하는 항목의 조회 최적화를 위해 요소의 순서를 수정할 수 있음) – josefx
@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'에 영감을 주었기 때문에 그렇지 않다면 매우 놀랍습니다. –