我创建了一个类 CThread
它应该是许多其他类的基类,包含与线程相关的代码。
在 CThread
我有一个变量。
int (*m_fpRun)() = 0;
这里有一个变量: CThread
是由类继承的 CTemp
和 m_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);
长话短说,你不能做你正在尝试的事情。 你的 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;
};
你的编译器是正确的 :-)
方法的第三个参数 pthread_create
是 void * (*)(void *)
(一个指向函数的指针,取一个指向 void
作为参数,并返回一个指向 void
)
你的论点类型是 int (**)()
(指针指向一个函数的指针,不取任何东西作为参数,并返回一个 int
)
简而言之:对于返回类型,没有办法将一个值转换为指针,对于参数,没有办法将什么都不转换为一个指向void的指针。
你必须改变 m_pfRun
.