为create_thread指定一个存储函数。

问题描述 投票:0回答:1

我创建了一个类 CThread 它应该是许多其他类的基类,包含与线程相关的代码。

CThread 我有一个变量。

int (*m_fpRun)() = 0;

这里有一个变量: CThread 是由类继承的 CTempm_fpRun 是分配程序 CTemp::Run()

我试着把这个函数分配给

iRetVal = pthread_create(&m_sThreadID,
                         m_pAttr,
                         &m_fpRun,
                         m_pArg);

但我总是得到这个错误。

error: cannot convert ‘int (**)()’ to ‘void* (*)(void*)’ for argument ‘3’ to ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)’
                            m_pArg);
c++ multithreading
1个回答
0
投票

长话短说,你不能做你正在尝试的事情。 你的 m_fpRun 变量的类型不适合 pthread_create() 是期待的。 如果它是正确的类型,那么你就不能给它分配个 非静态 类方法。

简而言之,你根本不能使用 非静态 类方法作为 pthread 回调。 你需要使用中间的独立函数或 静态 类方法,然后可以根据需要调用你的目标函数,例如。

#include <functional>

class CThread
{
private:
    pthread_t m_sThreadID;
    pthread_attr_t *m_pAttr = nullptr;

    static void* StaticRun(void *arg)
    {
        CThread *pThis = (CThread*) arg;
        int iRetVal = pThis->m_fpRun();
        ...
        return nullptr; 
    }

protected:
    std::function<int()> m_fpRun;

public:
    void Start()
    {
        int iRetVal = pthread_create(&m_sThreadID,
                                     m_pAttr,
                                     &StaticRun,
                                     this);
        ...
    }
};

class CTemp : public CThread
{
private:
    int Run()
    {
        ...
    }

public:
    CTemp()
    {
        m_fpRun = [this](){ return this->Run(); };
    }
};

或者,你应该使用一个 virtual 方法,而不是一个函数指针变量,如

class CThread
{
private:
    pthread_t m_sThreadID;
    pthread_attr_t *m_pAttr = nullptr;

    static void* StaticRun(void *arg)
    {
        CThread *pThis = (CThread*) arg;
        int iRetVal = pThis->Run();
        ...
        return nullptr; 
    }

protected:
    virtual int Run() = 0;

public:
    void Start()
    {
        int iRetVal = pthread_create(&m_sThreadID,
                                     m_pAttr,
                                     &StaticRun,
                                     this);
        ...
    }
};

class CTemp : public CThread
{
private:
    int Run() override
    {
        ...
    }

public:
    CTemp() = default;
};

0
投票

你的编译器是正确的 :-)

方法的第三个参数 pthread_createvoid * (*)(void *)(一个指向函数的指针,取一个指向 void 作为参数,并返回一个指向 void)

你的论点类型是 int (**)()(指针指向一个函数的指针,不取任何东西作为参数,并返回一个 int)

简而言之:对于返回类型,没有办法将一个值转换为指针,对于参数,没有办法将什么都不转换为一个指向void的指针。

你必须改变 m_pfRun.

© www.soinside.com 2019 - 2024. All rights reserved.