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'中声明的私有成员
此外,假设没有递归调用问题。
答案 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 ,并且不会共享函数调用中通过值传递的任何内容。