如何使用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 %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);
...
相关文章:
- 使用基类中的派生方法运行线程,而无需使用模板
- 使用 ubuntu 终端在 c++ 上运行线程类的问题
- 将项目添加到队列时运行线程
- 运行线程和线程对象之间的关系
- 在 gtest 中运行线程
- 是否有一种可接受的运行线程或按顺序执行的方法
- 从类中运行线程
- 如何在第三方函数调用之前同时运行线程
- 在优先级最低的核心中运行线程
- 在C++中并行运行线程
- 在C 11中的背景中运行线程
- 在运行线程中处理事件
- 使用对象生存期运行线程
- WINAPI CreateThread并不总是运行线程
- 树莓派与 c++ 运行线程,在网络上发布数据
- 使用变量类型 std::function 运行线程
- Eclipse CDT 多线程调试不是最佳的 - 如何以独占方式运行线程
- 在 C 语言的后台运行线程
- 正在运行线程
- 在远程计算机上运行线程