2010-12-05 8 views
1

boost::bindを使用して新しいboost::threadを作成し、boost::shared_ptrに格納しています。
boost::threadに関数と引数を渡していますが、スレッドが開始されたときに関数引数のコピーコンストラクタが正しく呼び出されません。boost :: bind、boost :: shared_ptr、およびboost :: threadを一緒に使用しているときにコピーコンストラクタが呼び出されない

私が使用しているスレッドの作成方法は、非常に一般的なブーストパターンであるので、私は、問題がどこにあることだとは思わない:

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 
} 

私はanotherfunc()myfunc()からWorkflowをコピーしようとしています。
Workflowにはコレクションが含まれているため、既存のコレクション内の要素を新しいWorkflowにコピーするコピーコンストラクタを用意しました。

残念ながら、anotherfunc()が新しいスレッドによって呼び出された場合、wfCopied内のコレクションは空です!
Workflowオブジェクトは部分的にコピーされていますが、文字列やintなどの他のメンバはコピーされていますが、コレクションの要素はコピーされていないことがわかります。

私はコピーコンストラクタは、このコードでそれをテストして正しく動作することを確認しました:

Workflow wf; 
// ... insert some elements into wf... 
Workflow wf1 = wf; 
// wf1 has the same elements 

私は私のテストはWorkflowのコピーコンストラクタが正常に動作していることを見せてくれたことを強調したいです。
しかし、完全を期すために、ここで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()) 
{} 
関連する問題