我正在尝试制作
ThreadPool::ThreadPool(int num_workers) {
workers.reserve(num_workers);
for (int i = 0; i < num_workers; i++) {
pthread_create(&workers[i], NULL, threadLoop, NULL);
}
}
void* threadLoop (void*);
这是threadLoop声明,它是ThreadPool类的私有成员函数,当我编译时,我得到一个错误invalid use of non-static member function
我试图使函数静态,但后来它看不到其他变量在课堂内宣布。我该如何解决这个问题?
答案 0 :(得分:0)
pthreads使用基于C的API,因此它只能为线程过程使用独立函数,而不能使用非静态类方法。 非静态类方法有一个隐藏的this
参数,pthreads不知道。
但是,您可以将threadLoop
声明为 static (删除this
参数),然后将类的this
指针传递给{{1在用户定义的参数中。
此外,您需要threadLoop
resize()
容器,而不是workers
容器。 reserve()
预先分配容器的内部内存,但它不会添加新元素(仅reserve()
更改,而不是capacity()
)。使用size()
访问尚未实际添加到容器的元素是未定义的行为。
请改为尝试:
operator[]
从技术上讲,使用非静态类方法作为独立函数也是未定义的行为,但它在大多数编译器中工作正常,并且有很多围绕该功能设计的库。如果有疑问,您可以随时定义一个实际的独立功能,如果需要访问非公开成员,请将其设为class ThreadPool
{
private:
std::vector<pthread_t> workers;
static void* threadLoop (void *arg);
public:
ThreadPool(int num_workers);
...
};
ThreadPool::ThreadPool(int num_workers)
{
workers.resize(num_workers);
for (int i = 0; i < num_workers; i++) {
pthread_create(&workers[i], NULL, threadLoop, this);
}
}
void* ThreadPool:threadLoop (void *arg)
{
ThreadPool *pThis = (ThreadPool*) arg;
// use pThis as needed...
}
。