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

时间:2014-06-14 20:46:59

标签: c++ pthreads raspberry-pi cross-compiling raspbian

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

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 %d\n", 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"的方法。启动连续正在侦听该类对象的线程的线程。上述问题的解决方案是什么?

1 个答案:

答案 0 :(得分:1)

我不是pthread专家,但问题是当pthread_create()的定义需要一个函数时,你试图给一个成员函数指针:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                    void *(*start_routine) (void *), void *arg);
然后,pthread将调用正常的" standalone"函数将arg作为参数。

会员功能然而不像#34;独立"功能。没有它的类和随之而来的数据就毫无意义。

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

包装器是静态成员函数。静态成员意味着它独立于类数据:

static void* BV4618::my_wrapper (void* arg) {
    ((BV4618*)arg)->FIFO( );
}

请注意,在现实生活中,当使用单独的类声明(在标题中)和定义(代码实现)时,静态关键字必须仅在声明中提供

为了实现这一点,你需要稍微重新定义你的FIFO功能,因为它不再期望一个参数:

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

您的初始化代码如下:

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