Короче говоря, вы не можете делать то, что вы пытаетесь. Ваша переменная m_fpRun
просто неправильного типа для того, что ожидает pthread_create()
. И если бы это был правильный тип, то вы не могли бы присвоить ему метод класса non-stati c.
Короче говоря, вы просто не можете использовать non -stati c метод класса в качестве обратного вызова pthread
. Вам нужно использовать промежуточную автономную функцию или stati c метод класса, и тогда он может вызывать вашу целевую функцию по мере необходимости, например:
#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;
};