나는 자체 맵을 사용하여 데이터를 저장하는 C++ 프로젝트에서 작업하고있다.이 의미에서 맵은 "지리 정보"맵, 즉 이미지와 비슷할 것이다. 거기에서 읽고 쓰는 다른 스레드가 있습니다. 지도의 데이터는 정수 벡터의 표준 벡터에 저장됩니다. 크기는 변경되지 않고 getter 및 setter 기능을 통해 특정 픽셀의 내용 만 변경됩니다.multithread vector
내 문제는 다음과 같습니다. 때로는 모든 것이 잘 작동하지만 더 자주 픽셀 값이 부호가 바뀌거나 완전히 달라져야한다는 의미에서 모든 이미지가 손상됩니다. 이것이 픽셀에 대한 스레드 읽기/쓰기 액세스의 문제 일 수 있습니까? 그렇다면 표준 벡터 대신에 무엇을 사용해야합니까? 뮤텍스를 사용하여 하나의 스레드 만 벡터에 읽거나 쓰도록 시도했지만 이러한 읽기/쓰기 작업은 너무 자주 발생하므로 모든 작업에서 벡터를 잠그면 응용 프로그램이 너무 느려지 게됩니다.
1D 벡터를 사용해야합니다. 2D보다 뛰어납니다. – chris
원자 조작은 "크기가 변하지 않고 getter 및 setter 함수를 통해 특정 픽셀의 내용 만"라고 말하는 방식을 통해이 트릭을 수행 할 수 있습니다. 또한 캐시 중독을 최소화하기 위해 액세스를 '분할'(즉, 서로 다른 스레드가 정확히 동일한 픽셀을 수정하지 못하게)하십시오. 물론 두 개의 인접한 픽셀이 서로 일치한다는 것을 보장하지 않지만, 혼돈 된 방식으로 수정하면 잠금이 다시 보장되지 않습니다. 그러나 이는 보증합니다. 동시에 증가하고 감소하는 값은 "이상한"결과를 얻지 못합니다. – Damon
@Damon : C++ 11에 정의 된 메모리 모델은 인접한 픽셀로 설명하는 효과가 발생하지 않도록하기위한 것입니다. [here] (http://stackoverflow.com/questions/6319146/)를 참조하십시오. –