2010-12-05 102 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 
} 

我想给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); 
} 

谁能帮助我?

+0

这是你的真实密码?使用`wf`作为`myclass :: anotherFunc`上的参数名和作为类成员似乎是可疑的。 – 2010-12-05 22:02:08

回答

2

看来你的拷贝构造函数是有缺陷的。您正在从空载体复制到您的载体。这导致没有任何内容被复制。

我想你的意思:

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

你是对的...但没有什么变化... – Andry 2010-12-05 21:55:32

0

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

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