boost thread 使用类的非静态成员函数做线程函数之【原理】
来源:互联网 发布:led屏幕控制软件 编辑:程序博客网 时间:2024/05/18 00:42
大家知道,pthread_create()函数的线程函数必须是静态的函数,以标准的__cdecl的方式调用的,而C++的成员函数是以__thiscall的方式调用的,相当于一个普通函数有一个默认的const ClassType* this参数。
为数据封装的需要,我常常把线程函数封装在一个类的内部,定义一个类的私有静态成员函数来作为pthread的线程函数,通常如下:
可以看见,创建线程的时候,把this指针作为线程的参数传入,然后在线程函数中用一个变量pThis来代替this指针。这样的做法比较丑陋,而且每次都要手动强制转换,很麻烦。
后来看了一些模版的资料,找到了一个简便些的技巧:
为数据封装的需要,我常常把线程函数封装在一个类的内部,定义一个类的私有静态成员函数来作为pthread的线程函数,通常如下:
class MyClass
...{
public:
MyClass();
private:
pthread_t tid;
staticvoid* _thread_t(void* param);
};
void* MyClass::_thread_t(void* param)
...{
MyClass* pThis= (MyClass*)param;
pThis->DoSomeThing();
//...
return NULL;
}
MyClass::MyClass()
...{
pthread_create(&tid, NULL, _thread_t,this);
}
...{
public:
MyClass();
private:
pthread_t tid;
staticvoid* _thread_t(void* param);
};
void* MyClass::_thread_t(void* param)
...{
MyClass* pThis= (MyClass*)param;
pThis->DoSomeThing();
//...
return NULL;
}
MyClass::MyClass()
...{
pthread_create(&tid, NULL, _thread_t,this);
}
后来看了一些模版的资料,找到了一个简便些的技巧:
template<typename TYPE,void (TYPE::*_RunThread)()>
void* _thread_t(void* param)
...{
TYPE* This= (TYPE*)param;
This->_RunThread();
return NULL;
}
class MyClass
...{
public:
MyClass();
void _RunThread();
private:
pthread_t tid;
};
void MyClass::_RunThread()
...{
this->DoSomeThing();
//...
}
MyClass::MyClass()
...{
pthread_create(&tid, NULL, _thread_t<MyClass,&MyClass::_RunThread>,this);
}
void* _thread_t(void* param)
...{
TYPE* This= (TYPE*)param;
This->_RunThread();
return NULL;
}
class MyClass
...{
public:
MyClass();
void _RunThread();
private:
pthread_t tid;
};
void MyClass::_RunThread()
...{
this->DoSomeThing();
//...
}
MyClass::MyClass()
...{
pthread_create(&tid, NULL, _thread_t<MyClass,&MyClass::_RunThread>,this);
}
函数模版不单可以替换模板中的类型本身,还能指定模板函数中使用该类型的某一成员函数。
注意:
1、名称只能是_RunThread,不能在指定模版参数的时候修改;
2、_RunThread只能是public的,除非把_thread_t定义到MyClass的内部。- boost thread 使用类的非静态成员函数做线程函数之【原理】
- 类的非静态成员函数做boost::thread参数
- 类的非静态成员函数作为线程函数
- 非静态类成员作为线程函数
- 线程的静态函数如何访问类的非静态成员函数或成员变量
- 多线程函数和静态线程函数调用类成员非静态变量和函数的问题
- 实现类非静态成员函数做窗口过程函数
- 利用BOOST, 成员函数做线程
- 用非静态类成员函数作为线程函数
- 用非静态类成员函数作为线程函数
- 用非静态类成员函数作为线程函数
- 非静态成员作为线程函数
- 非静态成员函数作为线程入口
- 用类的非静态成员函数作为线程入口函数的方法--转
- 关于编译器对c++ 类静态成员、静态成员函数、非静态成员函数的处理
- 使用boost.bind绑定class的成员函数作为boost thread的入口
- 静态成员函数和非静态成员函数的区别?
- 静态成员函数和非静态成员函数的区别?
- SQL Server 的数据存储(SQL Server data strorage)
- 双向循环队列解析
- Domino中使用Lotus Script处理XML
- 妈妈来照顾我了(二)
- 为什么我们总比别人钱少
- boost thread 使用类的非静态成员函数做线程函数之【原理】
- TextView使用指定的TTF字库
- a different object with the same identifier value was already associated with the session
- Linux启动流程
- 关于自动旋转
- Android 创建菜单(menu)的总结
- 怎么样上台演讲(结合ppt)。。超级实用。。。
- 如何在linux的gcc中添加c语言的外部链接库(“比如说,math.h"
- java中hashcode()和equal()方法的使用理解