N 요소의 벡터가 있지만이 벡터의 n 요소까지 의미있는 데이터가 있다고 가정 해 보겠습니다. 하나의 업데이터 스레드는 n 번째 또는 n + 1 번째 요소를 업데이트하고 (n = n + 1로 설정), n이 N에 너무 가깝고 필요한 경우 vector :: resize (N + M)을 호출합니다. 업데이트 후에는 스레드가 여러 하위 스레드를 호출하여 최대 n 번째 데이터를 읽고 일부 계산을 수행합니다.STL 벡터 및 스레드 안전
자식 스레드는 결코 데이터를 변경하거나 삭제하지 않으며 (실제로 데이터는 삭제되지 않습니다) 업데이트 프로그램은 업데이트 완료 직후에 자식을 호출합니다.
지금까지 아무런 문제가 발생하지 않았지만 이전 업데이트에서 일부 하위 작업 스레드가 남아있는 경우 큰 메모리 블록에 벡터를 재 할당하는 동안 문제가 발생할 수 있는지 묻고 싶습니다.
또는 다중 스레드 된 경우 벡터가 스레드로부터 안전하지 않으므로 안전합니까?
편집 : 업데이터가 vector :: resize (N + M, 0)을 호출 할 때 삽입이 이루어 지므로 내 문제의 가능한 해결책이 있습니까? STL 벡터의 뛰어난 성능으로 인해 잠금 가능 벡터로 대체하려고하지 않거나이 경우 성능이 뛰어나고 알려진 잠금없는 벡터가 있습니까?
@James McNellis : 예. 좋은 충고입니다.나는 직접 재배치를 할 수있다. 사실 벡터는 벡터에 대한 포인터를 보유하는 클래스 내에 래핑됩니다. 그것은 shared_ptr이 아니지만 새로운 큰 벡터를 쉽게 만들 수 있으며 이전 요소의 요소를 복사하고 삭제할 수 있습니다. 따라서 대용량 메모리 블록을 복사하는 가장 빠른 방법은 무엇입니까? CopyMemory()? –
더 간단한 해결책은 벡터 대신에'std :: deque'를 사용하는 것이 아닌가? 따라서 벡터와 거의 동등한 성능을 제공하면서도 재 할당을 완전히 피할 수 있습니다. – jalf
@jalf : 재 할당 만이 유일한 걱정거리가 아니기 때문에 'std :: deque'를 사용하는 것이 안전하다고 생각하지 않습니다. 'std :: deque :: operator []'가 'deque'내부 또는 다른 부기의 크기를 검사하지 않는다는 보장이 없으므로 소비자가'operator []를 호출하는 경쟁 조건이 발생할 수 있습니다. '는 생산자가 내부 상태를 수정하는 데이터를 추가하는 동안 내부 상태를 읽는다. –