为什么pthread_create不在同一个类中使用我的方法?

时间:2017-01-14 20:07:35

标签: c++ pthreads

我想从我的班级中产生一个帖子,但似乎无法找到使'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++

我该怎么做?

2 个答案:

答案 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参数将该对象传递给回调。