我想从我的班级中产生一个帖子,但似乎无法找到使'VisualStudio'
满意的正确公式。
我的班级看起来像:
pthread_create()
并且相应功能的实现如下:
#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++
我该怎么做?
答案 0 :(得分:1)
pthread_create
只接受常规函数指针(或兼容)来创建线程。它是C
兼容接口
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
C ++ 11线程抽象接口支持将类成员函数作为线程运行。当然,成员函数需要指向实际对象(this
指针)的指针,因此您必须将其传递给thread
对象
BfdEndpoint object;
std::thread thr{&BfdEndpoint::memfunc, &object, ...};
答案 1 :(得分:1)
问题1:pthread_create
期望一个以void*
为参数的函数。你的函数不接受void*
参数。
问题2:pthread_create
需要函数指针。在非静态成员函数上应用address-of运算符会生成成员函数指针。成员函数指针不能转换为常规函数指针。
解决方案:使用与pthread_create
期望的函数指针签名匹配的回调函数。这意味着您必须使用自由函数(或静态成员函数)。
您可以在该自由函数中的对象上调用成员函数。一个简单的例子:
void* RxSM(void*) {
static BfdEndpoint object;
object.RxSM();
}
您可能希望在创建该线程的对象上调用BfdEndpoint::RxSM
。您可以使用第四个void *arg
参数将该对象传递给回调。