제 질문은 꽤 간단합니다. 나는 값의 벡터를 가지고 있으며 (무관 한 스레드들), 나는 그들을 반복하고 싶다. 그러나 나에게 똑같이 보이는 두 가지 버전의 코드가 있지만 두 번째 버전 만 작동합니다. 나는 이유를 알고 싶다.C++ 괄호로 역 참조 (반복자 사용)
버전 1
int main(){
int someValue = 5;
vector<std::thread *> threadVector;
threadVector.resize(20);
for (int i = 0; i < 20; i++) {
threadVector[i] = new std::thread(foo, std::ref(someValue));
}
for (std::vector<std::thread *>::iterator it = threadVector.begin(); it != threadVector.end(); ++it) {
*it->join(); // *********Notice this Line*********
}
system("pause"); // I know I shouldn't be using this
}
버전 (컴파일되지 않음) 2 (합니까 작업)이이 작업의 순서에 문제가있다
int main(){
int someValue = 5;
vector<std::thread *> threadVector;
threadVector.resize(20);
for (int i = 0; i < 20; i++) {
threadVector[i] = new std::thread(foo, std::ref(someValue));
}
for (std::vector<std::thread *>::iterator it = threadVector.begin(); it != threadVector.end(); ++it) {
(*it)->join(); // *********Notice this Line*********
}
system("pause"); // I know I shouldn't be using this
}
'system ("pause")'을 사용하는 것뿐만 아니라 그 문제를 알고 있지만이 무관 한 코드를 게시하는 것은 개선의 여지가 있습니다. ;) 즉, 나는 std :: thread가 움직일 수 있고 컨테이너 (예 : 초기 boost :: thread가 아닌)에 저장할 수 있다고 생각한다. 내가 C++ 11을 가지고 놀지 않았기 때문에 나는 그렇게 많이 잘못 알았을 것이다. –
벡터 안에 무엇이 저장되어 있는지 설명해 주시겠습니까? 나는 unique_ptr을 선언하고 std ::를 벡터로 옮길 수 있다는 것을 의미한다. 그러나 새로운 문장과 다른 점은 무엇인가? – JohnJohn
내가 제안하는 것은 포인터와 동적 할당을 전혀 사용하지 않고 모든 예외 안전 문제와 다른 오버 헤드에 대해 제시 한 것입니다. 마찬가지로 '벡터'을 사용하지 않고 '벡터 '을 사용 하시겠습니까? 아니면? 나는이 경우에 당신이 정말로 그것을 피할 수 있는지 잘 모르겠다. –