`
ah_fu
  • 浏览: 231827 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

技巧:在pthread的线程函数中,使用类的非静态成员函数来执行

阅读更多
    大家知道,pthread_create()函数的线程函数必须是静态的函数,以标准的__cdecl的方式调用的,而C++的成员函数是以__thiscall的方式调用的,相当于一个普通函数有一个默认的const ClassType* this参数。
    为数据封装的需要,我常常把线程函数封装在一个类的内部,定义一个类的私有静态成员函数来作为pthread的线程函数,通常如下:
class MyClass
...{
public:
    MyClass();
private:
    pthread_t tid;
    
static void* _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);
}
    可以看见,创建线程的时候,把this指针作为线程的参数传入,然后在线程函数中用一个变量pThis来代替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);
}


     函数模版不单可以替换类型本身,还能替换类型的成员函数。
注意:1、名称只能是_RunThread,不能在指定模版参数的时候修改;
            2、_RunThread只能是public的,除非把_thread_t定义到MyClass的内部。
分享到:
评论
1 楼 清风皓月 2014-07-01  
void MyClass::_RunThread()这个方法有参数怎么办

相关推荐

    c++多线程编程

    - 可以在类中定义静态成员函数作为线程函数。这样可以在类中更好地封装线程相关的操作。 ##### 2. 传递参数给线程函数 ```cpp void* say_hello(void* args) { int i = *((int*)args); cout ; } ``` - 通过指针...

    C++_Class_static_member.rar_多线程 linux

    静态成员函数与非静态成员函数相比,不隐含接收`this`指针,因此它们不能访问非静态成员,但可以访问静态成员和全局变量。 **静态数据成员** 1. **初始化**:静态数据成员必须在类外初始化,因为它们不是对象的一...

    VC++知识集

    这个函数将调用一个非静态成员函数,该非静态成员函数将实际执行所需的任务。 ```cpp class MyClass { public: static UINT ThreadFunction(LPVOID pParam); // 静态线程函数 void RunTask(); // 实际任务...

    MFC创建用户界面线程方法2

    2. 覆盖`CWinThread`成员函数:在`CMyUIThread`中,我们需要重写`CWinThread`的一些关键成员函数,如`ExitInstance`(用于清理线程资源)、`PreThreadMessage`(处理线程消息)和`Run`(执行线程的主要逻辑)。...

    详解C++ thread用法总结

    swap函数允许交换两个线程对象的底层句柄,而硬件并发数可以通过hardware_concurrency静态成员函数获取,这通常反映了处理器的核心数量。 除此之外,C++11还定义了一个this_thread命名空间,包含了与当前线程相关的...

    MFC 多线程

    创建好线程类后,可以通过调用CWinThread的静态成员函数`AfxBeginThread()`来启动新线程。需要传入线程类的类型和一个参数指针,例如: ``` CMyThread* pThread = AfxBeginThread(RUNTIME_CLASS(CMyThread), NULL...

    VC2010中异步多线程窗体for循环输出

    4. 实现一个工作线程函数,该函数执行for循环中的任务: ```cpp UINT ThreadFunc(LPVOID pParam) { // 获取对话框指针 CMyDialog* pDlg = (CMyDialog*)pParam; for (int i = 0; i ; ++i) { // 使用PostMessage向...

    2021-2022计算机二级等级考试试题及答案No.3473.docx

    12. 静态成员访问:静态成员是根据类进行访问的,而不是对象。 13. Word数学公式:在Word中,通过“插入”菜单下的“公式”按钮可以插入数学公式。 14. 数组和指针:如果定义了`int a[3]={1,4,7}`并声明`*p=&a[2]`...

    C语言高级编程技术 C语言高级编程技术

    10. **编译器和链接器**:了解编译过程和链接过程,知道如何使用编译器选项来优化代码,以及链接库和静态库的区别。 在学习这些高级技术时,阅读高质量的C语言书籍,如《C Programming Language》(K&R)和《Expert...

Global site tag (gtag.js) - Google Analytics