繁体   English   中英

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

[英]How to run a thread inside an object using pthread

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

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”的方法,该方法启动线程,这些线程不断地侦听此类对象上的某些内容。 以上问题的解决方案是什么?

我不是pthread专家,但是问题是,当pthread_create()的定义需要一个函数时,您尝试提供一个指向成员函数的指针:

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

然后,pthread将调用一个普通的“独立”函数,并为其提供arg作为参数。

但是, 成员函数不能像“独立”函数那样工作。 没有它的类别和随之而来的数据,它就毫无意义。

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

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

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

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

为此,您需要稍微重新定义FIFO函数,因为它将不再需要参数:

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

您的初始化代码将如下所示:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM