复制构造函数在使用boost :: bind,boost :: shared_ptr和boost :: thread时未调用

时间:2010-12-05 21:37:21

标签: c++ multithreading boost shared-ptr copy-constructor

我正在使用boost::thread创建新的boost::bind,并将其存储在boost::shared_ptr
我将函数和参数传递给boost::thread,但是当线程启动时,它没有正确调用函数参数的复制构造函数。

我正在使用的线程创建方法是一种非常常见的Boost模式,所以我不认为这就是问题所在:

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
}

我正在尝试将Workflowmyfunc()复制到anotherfunc() Workflow包含一个集合,因此我提供了一个复制构造函数,用于将现有集合中的元素复制到新的Workflow

不幸的是,当新线程调用anotherfunc()时,wfCopied内的集合为空! 我可以告诉Workflow对象被部分复制,因为其他成员如字符串和整数已被复制,但集合中的元素没有。

我已通过以下代码验证了复制构造函数是否正常工作:

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

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

看起来您的复制构造函数存在缺陷。您正在从空矢量复制到矢量。这导致没有被复制。

我认为你的意思是:

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

答案 1 :(得分:0)

你知道构造函数初始化列表是什么吗?为什么要在构造函数中清除容器?

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