C ++ Boost,在类中使用thread_group

时间:2011-12-16 05:04:30

标签: c++ multithreading boost

class c
{
public:
    int id;
    boost::thread_group thd;
    c(int id) : id(id) {}
    void operator()()
    {
        thd.create_thread(c(1));
        cout << id << endl;
    }


};

我创建了课程c。每个类对象都创建线程以处理工作。但是,当我编译这个

时,我得到了这个奇怪的消息

:错误C2248:'boost :: thread_group :: thread_group':无法访问类'boost :: thread_group'中声明的私有成员

此外,假设没有递归调用问题。

1 个答案:

答案 0 :(得分:3)

问题在于您的代码设置方式是传递对象的副本以创建新线程。

您收到错误是因为boost :: thread_group的复制构造函数是私有的,因此您无法复制类c的对象。您无法复制类c的对象,因为默认复制构造函数尝试复制所有成员,并且它无法复制boost :: thread_group。因此编译错误。

对此的经典解决方案是编写自己的复制构造函数,不尝试复制boost :: thread_group(如果您实际上每个调用需要一个唯一的thread_group)或者将boost :: thread_group存储在某些指针中可以复制的类型(可以共享组,也可能是你想要的)。

注意:

通常更简单的是不编写自己的operator(),而只是传递boost :: functions。这将通过

完成
#include <boost/thread.hpp>
#include <iostream>
using namespace std;
class c
{
public:
    boost::thread_group thd;

    void myFunc(int id)
    {
        boost::function<void(void)> fun = boost::bind(&c::myFunc,this,1);
        thd.create_thread(fun);
        cout << id << endl;
    }


};

请注意,类c中的任何内容都是 shared ,并且不会共享函数调用中通过值传递的任何内容。