Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在同一类的成员函数上启动类构造函数内部的pthread?_C++_Multithreading_Class_Pthreads - Fatal编程技术网

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。