如何在同一个类的成员函数的类构造函数中启动pthread?

时间:2017-11-18 16:55:03

标签: c++ multithreading class pthreads

我正在尝试制作

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我试图使函数静态,但后来它看不到其他变量在课堂内宣布。我该如何解决这个问题?

1 个答案:

答案 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... }