멀티 스레드 응용 프로그램에서 std :: vector를 공유 데이터로 사용하고 있습니다. 나는 때로는 std :: thread 안전성, 멀티 스레딩
class ABC {
public:
double a, b, c;
};
boost::mutex mutex1;
class XYZ {
public:
XYZ(vector<ABC> & pVector) {
ptrVector = &pVector;
m_thread = boost::thread(&XYZ::Start, this);
}
~XYZ() {}
void Start();
public:
vector<ABC> * ptrVector;
boost::thread m_thread;
};
void XYZ::Start() {
try {
while(1) {
boost::this_thread::interruption_point();
for (unsigned int i=0; i<ptrVector->size(); i++) {
{
boost::mutex::scoped_lock lock(mutex1);
ptrVector->at(i).a = double(rand())/10000;
ptrVector->at(i).b = double(rand())/10000;
ptrVector->at(i).c = double(rand())/10000;
}
}
}
}
catch(boost::thread_interrupted) {}
catch(std::exception) {}
}
내가 응용 프로그램을 닫습니다
는, 디버그에,이 오류 메시지, 때때로 오류 메시지가 없을 것입니다있을 것, 예를 들어, 클래스 내부의 스레드를 캡슐화합니다. 나는 종종 사람들이 std :: vector에 대해 이야기하는 것을 들었다. thread-safe가 아니라,이 경우 중 하나인가? Visual Studio 2008을 사용하고 있습니다. 스레드를 늘리면 벡터 크기가 고정됩니다. 누구든지 다중 스레드 응용 프로그램에서 std :: vector를 사용하는 방법에 대한 조언을 제공 할 수 있습니까? ETP.exe에서 0x7688b9bc에서- 첫 번째 예외 : 마이크로 소프트 C++ 예외 : 메모리 위치 0x02d8f7bc에서 표준 : : out_of_range .. ETP.exe에서 0x00e916e0에서
- 첫 번째 예외 :가 0xc0000005 : 액세스 위반 위치는 0x00000008입니다.
- 세컨드 찬스 어설 션 실패 : 파일 C : 9.0 \ VC의 \ 벡터를 \ 포함 마이크로 소프트 비주얼 스튜디오 \ \ 프로그램 파일 (86), 라인 두 번째 기회 어설 션 실패 : 파일 c : 시각 \ 프로그램 파일 (86) \ 마이크로 소프트 스튜디오 9.0 \ vc \ include \ vector98
감사합니다.
벡터는 스레드로부터 안전하지 않습니다. 당신은 그것을 잠그고 있으며 다른 코드를 사용하지 않고 어떻게 사용하고 있는지를 알기 때문에 무엇이 잘못 될지 말할 수 없습니다. 이 특정 코드는 그 자체로 잘 보입니다. – Jarryd
스레드 안전과 별도로 스레드가 벡터에 액세스하는 순서를 고려해야합니다. 한 스레드가 벡터에서 읽는 경우 다른 스레드가 벡터 앞에 쓰여 있는지 확인해야합니다. 코드는 벡터에 기록되지 않은 조건을 처리해야합니다. –
@ Jarryd이 코드에서 뮤텍스를 사용하여 벡터를 잠그는 것 같습니다. 문제가 발생하지 않아야합니다. 자세한 내용은 전체 코드를 참조하십시오. –