2010-12-05 4 views
1

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); 
} 

이 사람이 나를 도와 줄 수는?

+0

실제 코드입니까? 'myclass :: anotherFunc'의 매개 변수 이름으로 'wf'를 사용하면 클래스 멤버가 의심스러워 보입니다. –

답변

2

복사 생성자에 결함이있는 것 같습니다. 빈 벡터에서 벡터로 복사 중입니다. 어떤 것도 복사되지 않습니다.

for (it = (workflow->_tasks).begin(); it < (workflow->_tasks).end(); it++) 
    (this->_tasks).push_back(*it); 
+0

당신 말이 맞아 ...하지만 아무것도 바뀌지 않아 ... – Andry

+0

어쨌든, 이것은 버그였습니다! 당신의 도움에 감사드립니다 ... 어리석은 버그 .... 나는 정말 어리석은 실수를 저질렀습니까? – Andry

+0

방금 ​​시도한 것을 개념적으로 수행하는 테스트 코드를 컴파일했습니다. 나는 예상되는 결과를 얻는다. 아마도 코드 스 니펫에서 누락 된 다른 것이있을 수 있습니다. – tallganglyguy

0

당신은 초기화 목록이 무엇인지 생성자 알아 :

난 당신 말은 생각? 그리고 왜 정확히 생성자에서 컨테이너를 지우시겠습니까?

Workflow::Workflow(const Workflow& workflow): _id(workflow._id), 
    _tasks(workflow._tasks.begin(), workflow._tasks.end()) 
{}