2013-09-29 3 views
0

std::vector '수신기'를보고 크기가 receivers.size() 인 배열에 넣고 수신 동작을 완료 한 요소의 배열에서 인덱스를 반환하는 MPI_Waitany을 실행하는 '수신기'스레드가 있습니다. .std :: vector에서 작동하는 다중 스레드 :이 경우 잠금이 필요합니까?

다음을 통해 수신기 벡터에서 지워집니다 완료 요소 :를 통해

receivers.erase(receivers.begin() + completed_index); 

그러나, 다른 스레드가 벌어지고있는이 하다니 '수신기'벡터에 요소를 밀어 수 :

receivers.push_back(receiver_message); 

이 위험한가요? 추가 요소로 인해 C++에서 벡터의 크기를 조정하게되면 이터레이터는 무효가 될 수 있습니다. 그러나 지우기의 반복자가 단일 지점에서 발생하여 버려지기 때문에 그 목적이 원자 적 조작이 아닌가?

잠금이 필요한 경우 요소의 모든 요소에 액세스 할 때마다 벡터를 잠글 필요가 있습니까? 예 :

MPI_Start(&(receivers.at(0)->request)); 

요소 0이 절대로 변경 되더라도 잠금이 필요합니까?

감사

+0

http://stackoverflow.com/questions/4346742/stl-vector-and-thread-safety – timrau

답변

3

간단한 규칙은 스레드 중 하나가 "어떤 방법으로 그것을 수정"으로 느슨하게 번역하는 (벡터 쓸 것입니다 경우이다 ('요청'요소의 단지 일원이다)), 모든 스레드에 대해 잠금을 사용하여 일관된보기를 만들어야합니다.

벡터가 읽기 전용 인 경우에만 잠금없이 사용할 수 있습니다.

0

내부적으로 STL의 벡터는 해당 벡터 유형의 연속적인 메모리 블록으로 구현됩니다. 벡터를 수정할 때 오래된 메모리를 제거하기 전에 메모리 블록의 크기를 조정하고 기존 값을 새로운 위치로 복사 할 수 있습니다. 여러 동시 액세서가 이전 위치의 내부 메모리를 변경하여 잠글 수 있습니다. 이것의 위에, 벡터는 현재 할당 된 크기의 내부 카운트와 어쨌든 동기화되지 않은 현재 사용을 유지합니다. 동기화없이 내장 된 서적을 파괴 할 수 있습니다.

관련 문제