我试图在c ++中实现一个简单的线程池,如下所示:
class worker {
public:
worker();
thread mThread;
private:
void run();
};
worker::worker() {
(this->mThread = thread(&worker::run, this)).detach();
}
class threadpool {
public:
threadpool(int size);
void addTask();
private:
vector<worker> workers;
};
但是当我添加threadpool的构造函数时:
threadpool::threadpool(int size) {
this->workers = vector<worker>(size, worker());
}
我得到“试图引用已删除的函数”错误,据我所知,这意味着在我的代码中某处我试图复制一个线程。有没有办法解决这个问题?
答案 0 :(得分:3)
最小的变化是:
threadpool::threadpool(int size) {
this->workers = vector<worker>(size);
}
也就是说,初始化列表很可爱。
threadpool::threadpool(int size)
: workers{size}
{ }
(你应该从int size
更改为size_t
或 - 如果您感觉圣洁 - vector<worker>::size_type
)。
提供了一个请求复制的原型worker()
对象,删除了隐式构造函数,因为您提供了一个显式的默认构造函数。