2010-01-31 7 views
13

Suppoes 나는이 :어떤 작업이 std :: map에서 스레드로부터 안전합니까?

stl::map<std::string, Foo> myMap; 

다음과 같은 기능 스레드 안전합니까?

myMap["xyz"] ? 

.l.e. 이 거대한 읽기 전용 맵을 여러 스레드에서 공유하고 싶습니다. 하지만 검색하는 것조차 스레드로부터 안전한지 여부는 알 수 없습니다.

감사합니다.

편집 :

모든 내용이 처음 한 번 기록됩니다.

그런 다음 여러 스레드가이 스레드를 읽습니다.

가능한 한 faast로 만들기 위해 잠금을 피하려고합니다. (내가 알고있는 yaya 가능한 조숙 한 최적화)

답변

11

이론적으로 STL 컨테이너는 스레드 세이프가 아닙니다. 실제로 컨테이너가 동시에 수정되지 않으면 읽기가 안전합니다. 즉, 표준은 스레드에 대한 사양을 작성하지 않습니다. 다음 버전의 표준은 IIUC에서 안전한 읽기 전용 동작을 보장합니다.

정말로 염려되는 경우에는 이진 검색으로 정렬 된 배열을 사용하십시오.

2

STL 모음은 스레드 안전하지 않지만 스레드 안전을 추가하는 것은 상당히 간단합니다.

가장 좋은 방법은 해당 컬렉션을 중심으로 threadsafe 래퍼를 만드는 것입니다.

6

적어도 Microsoft의 구현에서 컨테이너에서 읽기는 스레드로부터 안전합니다 (reference).

그러나 std::map::operator[]은 데이터를 수정할 수 있으며 const으로 선언되지 않습니다. 대신 std::map::find (const)을 사용하여 const_iterator이되고 참조를 취소해야합니다.

+0

컨테이너에 내용이 있기 위해서는 그 내용을 기록해야합니다. 따라서 스레드 안전 관심사. –

+1

질문은 우리가 읽기 전용 맵을보고 있음을 지정합니다.이 말은 여러 스레드에서 읽히기 전에 한 스레드에서 완전히 채워 졌다고 가정합니다. –

4

이론적으로 읽기 전용 데이터 구조와 함수는 스레드 안전을 위해 잠금을 필요로하지 않습니다. 그것은 본질적으로 스레드로부터 안전합니다. 동시 메모리 읽기에이라는 데이터 경합이 없음 입니다. 그러나 하나의 스레드 만 안전한 초기 화를 보장해야합니다.

Max S.는 지적했듯이, myMap["xyz"]과 같은 맵에서 요소를 읽는 대부분의 구현에는 쓰기 작업이 없습니다. 그렇다면 안전합니다. 그러나 다시 한번, 초기화 단계를 제외하고 구조를 수정하는 스레드가 없음을 보장해야합니다.

7

C++ 11은 const으로 선언 된 모든 멤버 함수가 다중 판독기에 대해 스레드로부터 안전해야합니다.

std::map::operator[]const으로 선언되지 않으므로 myMap["xyz"]을 호출하면 스레드로부터 안전하지 않습니다. std::map::atconst으로 선언되어 있으므로 myMap.at("xyz")을 호출하면 스레드로부터 안전합니다.

관련 문제