如何使用pthread在对象中运行线程

How to run a thread inside an object using pthread

本文关键字:运行 线程 对象 何使用 pthread      更新时间:2023-10-16

我在使用这段代码时遇到了一些麻烦。

void BV4618::InitializeThreads(void){
    pthread_t T_FIFO, T_Buffer;
    pthread_create( &T_FIFO, NULL, FIFO, NULL);
    pthread_create( &T_Buffer, NULL, readKBuffer, NULL);
}

方法FIFO和readKBuffer做这些事情…

void *BV4618::FIFO(void*){
    while (isWorking){
        if (qsize > 0){
            if(params[0] == -1){
                ReceiveData();
            }else{
                SendData(params[0]);
            }
            //printf("Processing in position %d value %dn", qsize, params[0]);
            ShifterQ();
        }else{
            usleep(50000);
        }
    }
    return NULL;
}

关键是,从程序的角度来看,一切都运行得很好,没有问题。现在,我要用类重写所有东西,我遇到了一些问题,比如

cannot convert 'BV4618::FIFO' from type 'void* (BV4618::)(void*)' to type 'void* (*)(void*)'    BV4618.cpp

构造函数调用一个名为"InitializeThreads"的方法,该方法启动线程,该线程持续侦听该类对象上的某些内容。解决上述问题的方法是什么?

我不是pthread专家,但问题是,当pthread_create()的定义期望一个函数时,您试图给出一个指向成员函数的指针:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                    void *(*start_routine) (void *), void *arg);
然后,

pthread将调用一个普通的"独立"函数,将arg作为参数。

然而,成员函数并不像"独立"函数那样工作。没有它的类和与之相关的数据是没有意义的。

我建议创建一个静态包装函数,并使用this(指向类的指针)作为参数。然后包装后的代码将参数重新转换为BV4618,并调用该类的成员函数。

包装器是一个静态成员函数。静态成员意味着它独立于类数据:
static void* BV4618::my_wrapper (void* arg) {
    ((BV4618*)arg)->FIFO( );
}

请注意,在实际生活中,当使用单独的类声明(在头文件中)和定义(代码实现)时,静态键必须在声明中只提供

要使其工作,您需要稍微重新定义您的FIFO函数,因为它不再需要参数:

void *BV4618::FIFO(){
    ...
}

你的初始化代码看起来像:

...
pthread_create( &T_FIFO, NULL, my_wrapper, this);
...