c++ - 为什么 pthread_create 不在同一个类中采用我的方法?

标签 c++ pthreads

我想从我的类中生成一个线程,但似乎无法找到使 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/

相关文章:

c++ - C++用户输入和错误处理

c++ - 不抛出或异常?

c++ - 在 C++ 中预定义 >> 运算符以跳过 '(' 和 ')'

c - 如何在后台运行函数?

multithreading - 互斥体所有权是否严格地仅传递给在解锁之前请求锁定的线程?

android - 如何在android共享库中链接多个静态库

c++ - 在字符串中使用空字符 (C++)

c - 如何使用互斥体同步多个线程?

c - 使用 select() 调用文件 I/O 的 Pthread 生产者/消费者

c - pthread_create 的 LD_PRELOAD 问题