我想从我的类中生成一个线程,但似乎无法找到使 pthread_create()
快乐的正确公式。
我的类(class)看起来像:
#ifndef _BFD_ENDPOINT_H_
#define _BFD_ENDPOINT_H_
#include <pthread.h>
using namespace std;
enum BfdState_e {
BFD_STAT_ADMIN_DOWN = 0,
BFD_STAT_DOWN,
BFD_STAT_INIT,
BFD_STAT_UP };
class BfdEndpoint {
public:
int RxIntvlSet(int);
int TxIntvlSet(int);
int MultSet(int);
int ActvSet(bool);
enum BfdState_e StatusGet();
BfdEndpoint(); // constructor
~BfdEndpoint(); // destructor
public:
//configuration params
int rx; // Rx interval [us]
int tx; // Tx interval [us]
int mult; // multiplier
bool active; // active (1) or passive (0) endpoint
//internal vars
enum BfdState_e status;
pthread_t *RxTh;
pthread_t *TxTh;
//internal methods
int Start();
void *RxSM(void);
void *TxSM(void);
};
#endif
相应函数的实现如下所示:
void *BfdEndpoint::RxSM(void)
{
return NULL;
}
int BfdEndpoint::Start(void)
{
int rv = 0;
rv = pthread_create(RxTh,NULL,&BfdEndpoint::RxSM,NULL);
}
和 g++
正在咆哮以下内容:
$ g++ *.cpp -o bfd
bfd.cpp: In member function ‘int BfdEndpoint::Start()’:
bfd.cpp:34:55: error: cannot convert ‘void* (BfdEndpoint::*)()’ to ‘void* (*)(void*)’ for argument ‘3’ to ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)’
rv = pthread_create(RxTh,NULL,&BfdEndpoint::RxSM,NULL);
我该怎么做?
最佳答案
问题 1:pthread_create
需要一个以 void*
作为参数的函数。您的函数不接受 void*
参数。
问题 2:pthread_create
需要一个函数指针。在非静态成员函数上应用寻址运算符会产生一个成员函数指针。成员函数指针不可转换为常规函数指针。
解决方案:使用与pthread_create
期望的函数指针签名相匹配的回调函数。这意味着您必须使用自由函数(或静态成员函数)。
您可以在该自由函数内调用对象的成员函数。一个简单的例子:
void* RxSM(void*) {
static BfdEndpoint object;
object.RxSM();
}
您可能希望在创建线程的对象上调用 BfdEndpoint::RxSM
。您可以使用第四个 void *arg
参数将该对象传递给回调。
关于c++ - 为什么 pthread_create 不在同一个类中采用我的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41654459/