C++ 如何在同一类的成员函数上启动类构造函数内部的pthread?
我正在努力使自己变得更好C++ 如何在同一类的成员函数上启动类构造函数内部的pthread?,c++,multithreading,class,pthreads,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); } } ThreadPool::ThreadPool(int num_workers)
ThreadPool::ThreadPool(int num_workers) {
workers.reserve(num_workers);
for (int i = 0; i < num_workers; i++) {
pthread_create(&workers[i], NULL, threadLoop, NULL);
}
}
ThreadPool::ThreadPool(int num_workers){
工人储备(工人数量);
对于(int i=0;i
void*螺纹环(void*)
这是threadLoop声明,它是ThreadPool类的私有成员函数,当我编译时,我得到一个错误非静态成员函数的无效使用
我试图将函数设为静态,但它看不到类内声明的其他变量。如何解决此问题?pthreads使用基于C的API,因此它只能对线程过程使用独立函数,而不能使用非静态类方法。非静态类方法有一个pthreads不知道的隐藏的参数
但是,您可以将threadLoop
声明为静态(以删除this
参数),然后将类的this
指针传递到其用户定义的参数中的threadLoop
另外,您需要resize()
您的workers
容器,而不是reserve()
它reserve()
预先分配容器的内部内存,但不会添加新元素(只有capacity()
更改,而不是size()
)。使用操作符[]
访问尚未实际添加到容器中的元素是未定义的行为
请尝试以下方法:
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...
}
类线程池
{
私人:
病媒工作者;
静态void*threadLoop(void*arg);
公众:
线程池(int num_workers);
...
};
线程池::线程池(int num_workers)
{
workers.resize(num_workers);
对于(int i=0;i
从技术上讲,使用非静态类方法作为独立函数也是一种未定义的行为,但它在大多数编译器中运行良好,并且有许多库是围绕该功能设计的。如果有疑问,您可以定义一个实际的独立函数,如果需要访问非公共成员,您可以将其作为类的朋友。使用std::thread。我必须使用pthread,不幸的是,您必须学习如何使用C API。