체크 된 STL implentation을 사용하여 코드에 예기치 않은 어설 션 faillures가 있습니다.C + + 벡터, 다른 스레드에서 push_back이 충돌하고 있습니까?
약간의 연구 끝에 나는 벡터가 생성 된 스레드와 다른 스레드에서 호출 된 벡터에서 push_back으로 문제를 좁혔다. 이 문제를 재현하는
간단한 코드는 다음과 같습니다
class SomeClass
{
private:
std::vector<int> theVector;
public:
SomeClass()
{
theVector.push_back(1); // Ok
}
void add()
{
theVector.push_back(1); // Crash
}
};
유일한 차이점은 SomeClass 내 메인 스레드에서 통해 인스턴스 것을, 그리고 다른 스레드에서 호출됩니다 추가 할 수 있습니다. 그러나 아무런 통일성 문제가 없습니다. 가장 간단한 형태의 코드는 위에서 언급 한 경우를 제외하고는이 벡터에서 읽거나 쓰는 것이 아닙니다.
push_back 코드를 살펴보면 count() 또는 size()와 같은 std :: vector의 일부 메서드가 다른 thred (메서드 "add")에서 호출 될 때 가비지를 반환하고 호출 할 때 올바른 값을 발견했습니다. (예를 들어, 생성자에서) 생성 스레드에서
다중 스레드 환경에서 std :: vector를 사용할 수 없다고 결론 내리겠습니까? 아니면이 문제에 대한 해결책이 있습니까?
편집 : 휘발성 제거
편집 2 : 당신이 문제가 멀티 스레드에 거짓말을하지 않는 것이 가능하다고 생각합니까? 내 테스트 실행에서 add는 한 번만 호출됩니다 (중단 점을 사용하여 확인 됨). 생성자에서 push_back을 제거하면 충돌이 발생합니다. 그래서 결국, 벡터의 메서드를 한 번만 호출하더라도 한 번 호출 된 함수에서 어설 션을 실패하게 만듭니다. 그러므로 concurency가있을 수 없다, 또는 ...?
실제로 동시성 벡터가 작동해야하는 경우가 있습니다. 벡터 *로 작업하는 스레드가 두 개 이상인 경우 * 병렬 *로 작동하지 않습니다. – Drakosha
각 스레드마다 자체 힙이있는 환경에 있습니까? – JimR
'예약'이라고 해보십시오. – Fozi