`
ah_fu
  • 浏览: 227889 次
  • 性别: 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()这个方法有参数怎么办

相关推荐

    error C1083: 无法打开包括文件:“pthread.h”

    error C1083: 无法打开包括文件:“pthread.h”: No such file or directory cocos2d-x-2.1.5\extensions\AssetsManager\AssetsManager.h 30 1 AssetsManagerTest

    Pthread线程包 Windows移植版

    **线程创建**:在Pthread中,可以使用`pthread_create()`函数创建新的线程。这个函数接受一个线程ID指针、线程属性(可选)、线程启动函数和传递给该函数的参数。 **线程同步**: - **互斥锁(Mutex)**:`pthread...

    Pthread 多线程C++动态库+静态库+头文件

    标题中的"Pthread 多线程C++动态库+静态库+头文件"指的是Pthread库在C++环境下的多线程应用,适用于Windows平台,并且兼容Visual Studio及MFC(Microsoft Foundation Classes)框架。Pthread,全称为POSIX Threads,...

    Pthread多线程编程指南

    《Pthread多线程编程指南》是一本专为开发者准备的深入解析Pthread线程库的手册,尤其适合那些在UNIX、Linux等操作系统环境中进行多线程编程的工程师。Pthread,全称POSIX线程(Portable Operating System Interface...

    c++成员函数成为线程函数

    在VS2008中使用MFC进行多线程编程,可以通过`AfxBeginThread`创建线程,并在成员函数中执行任务。为了安全地访问类的成员变量,需要采用同步机制,如互斥量或临界区,以防止数据竞争。理解并正确应用这些技术,对于...

    pthread 线程标准 (中)

    在深入探讨“pthread线程标准(中)”这一主题前,我们先来了解下何为pthread以及它在多线程程序设计中的核心地位。POSIX(可移植操作系统接口)线程,简称pthread,是Unix系统及其类Unix系统(如Linux、macOS等)中...

    pthread多线程求pi,linux多线程pthread,C,C++

    5. **命令行参数**:描述中提到“在命令行后输入线程数以及计算规模n运行”,这意味着程序可能通过`main()`函数中的`argc`和`argv`参数接收命令行输入,比如使用`atoi()`函数解析线程数和计算规模。 6. **性能优化*...

    Windows可使用的pthread库

    pthread-win32是pthread库的一个移植版本,它为Windows操作系统提供了与Posix线程兼容的API,使得C和C++开发者能够在Windows上使用pthread相关的函数,如`pthread_create`、`pthread_join`、`pthread_mutex_lock`等...

    Pthread创建一个线程

    1. **包含头文件**:在C程序中,我们需要包含`pthread.h`头文件来使用Pthread库中的函数。 2. **定义线程函数**:线程执行的代码位于一个特定的函数中,这个函数需要声明为`void*`返回类型,并接受一个`void*`类型...

    由浅入深Linux下pthread线程库介绍[归类].pdf

    线程属性结构为pthread_attr_t,在头文件/usr/include/pthread.h中定义。属性值不能直接设置,须使用相关函数进行操作,初始化的函数为pthread_attr_init。 线程属性包括: * 是否绑定 * 是否分离 * 堆栈地址 * ...

    pthread.zip_C++_pthread windows

    在C++编程中,多线程技术是实现并发执行任务的重要手段,而pthread库作为跨平台的多线程API,被广泛应用于Linux和Windows系统中。本文将深入探讨pthread库的基础知识、其在C++中的使用方法以及如何在两个主要操作...

    windows 下的pthread 库

    其中,`pthread`(Posix Threads)是UNIX和类UNIX操作系统上广泛使用的多线程API,它定义了一套标准的接口,使得开发者能够在不同的平台上创建和管理线程。尽管`pthread`最初设计用于符合POSIX标准的操作系统,但...

    c++pthread 线程封装

    在C++编程中,线程是并发执行的基本单元,它允许程序同时执行多个任务。`pthread`库是POSIX标准定义的一个线程处理接口,它广泛应用于Linux系统中。本主题将深入探讨如何使用C++封装`pthread`库,以及在Linux环境下...

    Linux pthread相关函数用法说明(包括发生段错误的原因以及对策等)

    根据给定文件的信息,本文将深入探讨Linux下pthread库中几个关键函数的使用方法,并针对“段错误”这一常见问题进行分析与对策建议。 ### 1. pthread_create #### 函数原型 ```c int pthread_create(pthread_t *...

    实验二:Linux多线程创建.docx

    其中,第一个参数是用于接收创建新的线程的 id,第二个参数是用于设置线程的属性,一般设置为 NULL,表示使用线程默认属性,第三个参数是函数指针,用于设置线程的主函数,当 pthread_create 函数返回时,则会自动...

    pthread线程库源代码

    在pthread线程库中,"锁的技巧"是一个重要的概念。锁是用来控制多个线程对共享资源访问的一种机制,以避免数据竞争和不一致性的发生。主要的锁类型包括: 1. 互斥锁(Mutex):互斥锁确保任何时候只有一个线程能...

    pthread手册.doc

    - 在使用`pthread_create`创建线程时,建议先初始化属性结构体`attr`,再根据需要设置特定属性。 - 分离线程时需要注意线程的生命周期,避免在`pthread_create`返回前线程就已经结束导致的问题。 - 使用`pthread_...

    由浅入深Linux下pthread线程库介绍

    1. **线程标识符类型**:`pthread_t` 是线程的标识符类型,它定义在头文件 `/usr/include/bits/pthreadtypes.h` 中,其定义为 `typedef unsigned long int pthread_t;`。 2. **线程创建**:`pthread_create` 函数...

    LINUX线程函数大全.pdf

    在Linux系统中,线程是进程内的轻量级执行单元,允许并发执行代码。线程函数主要用于线程的创建、管理以及同步。以下是对LINUX线程函数的详细解释: 1. **线程创建**: 使用`pthread_create()`函数创建一个新的...

    linux pthread 多线程控制示例代码

    在Linux操作系统中,多线程编程是通过POSIX线程库(pthread)来实现的,这个库提供了一套丰富的API,使得开发者可以在单个进程中创建并管理多个执行线程。`pthread`是POSIX标准的一部分,它允许程序员创建轻量级进程...

Global site tag (gtag.js) - Google Analytics