2009-07-13 2 views
0

이러한 조건에서 STL로 스레딩하는 것이 좋을까요?

나는 다음과 같은 형식의 콜렉션을 가지고있다 :

map<key, list<object> > 

나는 단지 목록의 뒤쪽에 삽입하고 때로는 전체 맵에서 읽는다 (그러나 초기화시를 제외하고는 맵에 쓰지 않는다).

알다시피, STL 컨테이너 중 어느 것도 스레드 안전하지 않지만 실제로는 키당 최대 하나의 스레드 만 가질 수 있습니다. 나는이 약정으로 꽤 안전 할 것이라고 가정 할 때 무엇인가 놓쳤는가?

답변

7

멀티 스레드 시나리오에서 맵이 전혀 수정되지 않으면 괜찮습니다. 각 스레드가 자체 목록을 보면 스레드 개인 데이터이기 때문에 괜찮습니다.

키가지도에 아직없는 경우 삽입 (수정)하기 때문에 [] 키를 사용하여 키를 조회하지 않도록주의하십시오.

그러나 왜이 구조가 필요한지 궁금합니다. 포인터/참조 또는 실제 목록 개체 자체를 각 스레드의 스택에 보관하지 않는 것이 좋습니다. 각 스레드마다 비공식적 인 이유는 무엇입니까?

(그렇지 않은 경우, 다음 목록에서 적절한 동기화가 필요합니다.) 사실

당신은 당신이 "전체지도에서 읽기"말 - 아마 어떤 임의의 스레드가 어떤을 반복하려고 할 수 있다는 것을 의미 기울기. 따라서 목록에서 작업을 반드시 동기화해야합니다.

+0

+1 동의합니다. 하나의 스레드 만 키에 액세스하거나 synchro를 사용한다는 사실을 보증하는 명시적인 구조를 갖는 것이 더 좋습니다. 문제는이 방법을 유지하면 조만간 (심지어 나중에) 코드를 사용하고 "끔찍한 버그로 이어지는"하나의 키 - 쓰레드 요구 사항 "을 잊을 것입니다. – neuro

+0

잘 모르겠습니다. 그것은 가난한 사람의 캐쉬와 같아요. 실제 문제는 우리가 데이터베이스를 망치고 액세스 프론트 엔드 (예, 알고 있습니다)를 사용하여 중요한 데이터에 테이블 잠금을 유발하는 일부 엿 같은 위니입니다. 불행히도 그는 대통령과 좋은 친구입니다. 아무도 해고하지 않고 이러한 문제를 일으키지 않도록 아무에게도 말할 수 없으므로 문제에 싫증이 났고 아무도 만질 수없는 다른 컴퓨터의 메모리에 직원의 일부 데이터를 저장하려고했습니다. 이 바보의 상수 잠금 때문에 데이터베이스를 사용할 수 없다면 대기열에 보관하여 데이터베이스를 업데이트합니다. –

+0

아, "전체 맵을 통해 읽는 것"은 감시자 스레드가 더티 삽입이나 업데이트를 찾아 다시 데이터베이스에 기록하는 작업입니다. 그 부분도 싱글 스레드이므로, 볼 수있는 유일한 문제는 스캔하는 동안 삽입하는 것입니다. 어쩌면 싱크로너스 화가 필요한 곳일지도 모르죠. 음. –

1

TBH만큼 중요한 섹션을 쓰고 읽으면 제대로 작동합니다.

관련 문제