【发布时间】:2010-12-05 21:37:20
【问题描述】:
我正在使用boost::bind 创建一个新的boost::thread,并将其存储在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
}
我正在尝试将Workflow 从myfunc() 复制到anotherfunc()。Workflow 包含一个集合,因此我提供了一个复制构造函数,将现有集合中的元素复制到新的@ 987654330@。
很遗憾,当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);
}
谁能帮帮我?
【问题讨论】:
-
这是你的真实代码吗?使用
wf作为myclass::anotherFunc上的参数名称和作为类成员似乎是可疑的。
标签: c++ multithreading boost shared-ptr copy-constructor