【问题标题】:Copy constructor not called when using boost::bind, boost::shared_ptr, and boost::thread together一起使用 boost::bind、boost::shared_ptr 和 boost::thread 时未调用复制构造函数
【发布时间】: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
}

我正在尝试将Workflowmyfunc() 复制到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


【解决方案1】:

您的复制构造函数似乎有缺陷。您正在从空向量复制到向量。这导致没有任何内容被复制。

我想你的意思是:

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

【讨论】:

  • 好吧,问题是另一个问题,:) 无论如何,这也是一个错误!谢谢你的帮助……真是个愚蠢的错误……我真的犯了这么愚蠢的错误吗?
  • 我刚刚编译了一些测试代码,这些代码在概念上可以满足您的要求。我得到了预期的结果。也许您的代码 sn-ps 中还遗漏了其他内容。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2012-03-18
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 2023-04-03
    • 2013-07-09
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    相关资源
    最近更新 更多