스레드를 사용하여 모든 작업을 빠르게 처리 할 수있는 프로젝트가 있습니다. 우리는 개별 스레드에서이 함수를 호출 할 수 있도록하려면 : 스레드를 생성 할 때 boost :: thread 런타임 오류가 발생했습니다.
Request& Filter::processRequest(Request& req)
그러므로 나는 반환 값에 액세스 할 수 있도록 람다 식의 기능을 포장.
는 이제 다음과 같은 런타임 오류가 발생합니다 :
glibc detected ... double free or corruption (!prev): ...
나는 모든 것이 잘 작동 그룹에 스레드를 추가하려면 행의 주석을 해제합니다.
boost::thread_group thread;
for (std::set<boost::shared_ptr<Filter> >::iterator i = sources_.begin();
i != sources_.end(); ++i) {
Request ret
thread.add_thread(new boost::thread(boost::lambda::var(ret) =
(*i)->processRequest(req)));
req+=ret;
...
}
thread.join_all();
이 런타임 오류의 원인은 무엇 일 수 있습니다. 아니면 개별 스레드에이 함수를 넣는 다른 방법이 있습니까?
부스트 :: lambda :: var (ret) = (* i) -> processRequest (req)'할일? 당신은 N 개의 스레드를 추가하는 루프에 있습니다 ... 그래서 N 개의 안정적인 "ret"장소에서 결과를 참조로 저장합니까? – HostileFork
ret와 함께하고 싶은 코드 위에 코드를 추가했습니다. 나는 그것을 req에 추가하고 싶다. 나는 ret의 사본이 모든 스레드에 넣어 지거나이 가정이 잘못되었다고 생각 했는가? – tune2fs
저는'boost :: lambda' 사용자가 아니기 때문에'boost :: thread'로 약간의 수정 만 했으므로 실제로 접근 방법에 대해 많이 알지 못합니다. 할 수있다 "). 비동기 작업을 시작하면 계산이 끝났음을 보증하지 않고 결과를 사용할 수 없습니다. 그리고 문서는'boost :: lambda :: var'가 참조에 의한 인수를 취할 것을 제안합니다 ("복사"한다면 어떻게 호출자가 사본에 연결하겠습니까?) ... 그래서 당신은 정말로 하나의'Request ret; '루프의 반복마다 "살아있다". – HostileFork