[英]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.