boost::bind
을 사용하여 새 boost::thread
을 생성하고 boost::shared_ptr
에 저장합니다.
boost::thread
에 함수와 인수를 전달하고 있지만 스레드가 시작될 때 함수 인수에 대한 복사 생성자를 올바르게 호출하지 않습니다.boost :: bind, boost :: shared_ptr 및 boost :: thread를 함께 사용하면 복사 생성자가 호출되지 않습니다.
내가 사용하고 스레드 생성 방법은 매우 일반적인 부스트 패턴, 그래서 문제가 곳이 생각하지 않습니다 : 나는 anotherfunc()
에 myfunc()
에서 Workflow
을 복사하려고
void myclass::myfunc() {
Workflow wfOriginal;
boost::shared_ptr<boost::thread>(
new boost::thread(boost::bind(&myclass::anotherfunc, this, wfOriginal)));
}
// ...
void myclass::anotherfunc(Workflow wfCopied) {
// Doing something
}
.
Workflow
에는 모음이 포함되어 있으므로 기존 모음의 요소를 새로운 Workflow
에 복사하는 복사 생성자를 제공했습니다.
anotherfunc()
이 새 스레드에 의해 호출되면 wfCopied
안에있는 콜렉션이 비어 있습니다!
문자열과 int 같은 다른 멤버가 복사 되었기 때문에 Workflow
개체가 부분적으로 복사되었음을 알 수 있지만 컬렉션의 요소에는 복사되지 않았습니다.
나는 복사 생성자가이 코드를 테스트하여 올바르게 작동하는지 확인했습니다 :
Workflow wf;
// ... insert some elements into wf...
Workflow wf1 = wf;
// wf1 has the same elements
나는 나의 테스트 Workflow
's이 (가) 생성자가 잘 작동 복사하는 것이 나에게 보여 주었다 강조하고 싶다.
하지만 완전성을 위해, 여기 Workflow
의 복사 생성자 :
Workflow::Workflow(const Workflow& workflow) {
this->_id = workflow._id;
(this->_tasks).clear();
Workflow::TaskCollectionConstIterator it;
for (it = (this->_tasks).begin(); it < (this->_tasks).end(); it++)
(this->_tasks).push_back(*it);
}
이 사람이 나를 도와 줄 수는?
실제 코드입니까? 'myclass :: anotherFunc'의 매개 변수 이름으로 'wf'를 사용하면 클래스 멤버가 의심스러워 보입니다. –