【问题标题】:How to start pthread inside class constructor on member function of same class?如何在同一类的成员函数上的类构造函数中启动 pthread?
【发布时间】:2017-11-18 16:55:03
【问题描述】:

我正在努力

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 我试图将函数设为静态,但是它看不到在类中声明的其他变量.我该如何解决这个问题?

【问题讨论】:

  • 使用 std::thread.
  • 不幸的是我不得不使用pthread
  • 不幸的是,您必须学习如何使用C API。

标签: c++ multithreading class pthreads


【解决方案1】:

pthreads 使用基于 C 的 API,因此它只能将独立函数用于线程过程,而不是 非静态 类方法。 非静态类方法有一个隐藏的this 参数,pthreads 不知道。

但是,您可以将threadLoop 声明为static(以删除this 参数),然后在其用户定义的参数中将类的this 指针传递给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... 
}

从技术上讲,使用非静态类方法作为独立函数也是未定义的行为,但它在大多数编译器中都可以正常工作,并且有很多围绕该功能设计的库。如果有疑问,您始终可以定义一个实际的独立函数,如果它需要访问非公共成员,则将其设为您的类的 friend

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-07
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多