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);
}
誰も私を助けることができますか?
これは実際のコードですか? 'myclass :: anotherFunc'のパラメータ名として' wf'を使用し、クラスメンバとしては疑わしいようです。 –