当前位置:  技术问答>linux和unix

pthread线程库和C++一起使用的问题

    来源: 互联网  发布时间:2015-07-11

    本文导语:  最近在Linux下学习C++,在编一个程序时需要多线程支持。 我最初的想法是在一个类(比如CWinamp)中,提供一个方法(比如CWinamp.play()),当调用这个方法时,就会创建一个线程,去执行一个很费时的操作.但是在编写中却遇...

最近在Linux下学习C++,在编一个程序时需要多线程支持。

我最初的想法是在一个类(比如CWinamp)中,提供一个方法(比如CWinamp.play()),当调用这个方法时,就会创建一个线程,去执行一个很费时的操作.但是在编写中却遇到了一个问题。

在pthread库中,创建线程的函数pthread_create()需要一个(void*)(*func)(void*)类型的参数,但是当我将类的一个成员函数(比如void* CWinamp::dosomething(void *))传给它时,编译器却告诉我类型不匹配。

我想这是因为对于类成员函数,由于编译器要隐式的添加一个this指针作为参数,而导致的类型不匹配。


请问,对于这种问题,有什么好的解决办法么?或者,在LinuxUnix下,如何在C++程序中完美的使用多线程?

|
对于这种问题,我在Windows中使用pthread库时一般是这么实现的,由于Windows下的pthread库实际上用法与Linux中的完全一致,因此 应该可行。
用你的例子来说明,你可以这种做,再实现一个同名但参数不同的的静态函数,如
static int play(void *p);
实现很简单:
int CWinamp::play(void *p)
{
    ((CWinamp*)p)->play();

    return 1;
}
然后,在pthread_create时,将这个CWinamp::play作为func型参数,同时将当前的CWinamp对象的地址传入作为参数(void *),如此即可。这样,就可以调用CWinamp中一切非Static型函数了。

|
可以将一个C函数直接作为回调函数,但是如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。通过查询资料发现,其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递一个指向自身的指针给其成员函数从而实现程序函数可以访问C++的数据成员。这也可以理解为什么C++类的多个实例可以共享成员函数但是确有不同的数据成员。由于this指针的作用,使得将一个CALLBACK型的成员函数作为回调函数安装时就会因为隐含的this指针使得函数参数个数不匹配,从而导致回调函数安装失败。要解决这一问题的关键就是不让this指针起作用,通过采用以下两种典型技术可以解决在C++中使用回调函数所遇到的问题。这种方法具有通用性,适合于任何C++。

  1). 不使用成员函数,直接使用普通C函数,为了实现在C函数中可以访问类的成员变量,可以使用友元操作符(friend),在C++中将该C函数说明为类的友元即可。这种处理机制与普通的C编程中使用回调函数一样。

  2). 使用静态成员函数,静态成员函数不使用this指针作为隐含参数,这样就可以作为回调函数了。静态成员函数具有两大特点:其一,可以在没有类实例的情况下使用;其二,只能访问静态成员变量和静态成员函数,不能访问非静态成员变量和非静态成员函数。由于在C++中使用类成员函数作为回调函数的目的就是为了访问所有的成员变量和成员函数,如果作不到这一点将不具有实际意义。解决的办法也很简单,就是使用一个静态类指针作为类成员,通过在类创建时初始化该静态指针,如pThis=this,然后在回调函数中通过该静态指针就可以访问所有成员变量和成员函数了。这种处理办法适用于只有一个类实例的情况,因为多个类实例将共享静态类成员和静态成员函数,这就导致静态指针指向最后创建的类实例。为了避免这种情况,可以使用回调函数的一个参数来传递this指针,从而实现数据成员共享。这种方法稍稍麻烦,这里就不再赘述。

|
把这个成员函数定义成static函数才行。
要么就做成普通函数。

    
 
 

您可能感兴趣的文章:

  • C++中,为什么执行pthread_mutex_lock()时执行了两次线程才被阻塞?
  • c++程序中使用pthread编译不过,请教大家?????
  • pthread_create错误,怎么在C++类中定义线程函数指针
  • 先pthread_cancel()再pthread_join(),主线程退出?
  • 大家好,pthread库创建线程,如何等待线程安全退出?
  • 一个线程能用pthread_kill(pid,SIGHUP)将另一个线程挂起么?
  • 问一个关于pthread线程删除(取消)的问题
  • 跪求:linux下pthread 双线程计算和单线程的运行时间完全相同是为什么?
  • 请问pthread_mutex_lock()和pthread_mutex_unlock()可不可以用于对不同进程的线程进行同步。
  • Unix中PThread是干什么用的,创建线程吗---小妹
  • 请教:pthread_join( )在等待一个已经退出的线程时为何会导致死锁?
  • 请教一个pthread线程库的使用的问题
  • 问个pthread线程库的问题
  • pthread线程问题
  • 求教,关于pthread_join 以及线程之间关系的问题
  • 用pthread_create建立线程后如何让线程运行的函数在create完了之后才实际运行 相当与windows下的CREATE_SUSPENDED ??
  • 求助!pthread与Win32 API线程库的对应问题
  • 关于线程pthread.h
  • 能不能查看获取pthread_mutex_t的线程id?
  • 请教sleep和pthread_delay_np:阻塞线程/阻塞进程?
  • pthread_cond_timedwait用来让线程睡眠无效?
  • Linux的线程库pthread是否有"亲缘性"的概念?
  • linux下进程和线程的区别(fork(),pthread_create())?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • pthread_attr_init()及pthread_cond_wait使用疑惑
  • 无法使用pthread_creat()函数的问题
  • 关于sem_open 使用及-pthread
  • 有关使用pthread_creat时的参数传递问题!!!
  • 请问有没头函数<pthread.h>和<signal.h>里的函数的详细功能介绍?和使用方法???
  • 关于pthread_wait和互斥锁配合的使用问题
  • 使用pthread库失败
  • 重分请教: fedora core 5中如何使用 pthread_suspend_np?是否需要外部库支持?
  • 在linux7.3下多个线程使用 pthread_cond_t 的一个小问题。
  • sigwait和pthread_kill的使用.只发了一个信号阿?怎么有等到两个????
  • 求助: pthread_rwlock_t 使用
  • linux下main thread如何使用pthread_join等待子线程结束后再退出
  • pthread_join的第二个参数怎么使用?
  • pthread库中如何使用RECURSIVE_MUTEX
  • 使用pthread多线程文件IO的问题
  • 进程间通信:pthread_cond使用在线程间,我要进程间条件同步(没有情缘关系的进程),采用什么方呢?也就是说我要在UNIX实现WIN32上命名Event的功能
  • aix pthread.h 使用编译出错
  • 使用pthreads实现真正的PHP多线程(需PHP5.3以上版本)
  • 使用pthread库实现openssl多线程ssl服务端和客户端
  • unix/Linux下c/c++ pthread库读写锁函数介绍
  • pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);和pthread_detach(pthread_self()); 有区别吗。怎么我执行的效果不一样
  • pthread_cond_signal和pthread_cond_wait两个函数是怎么意思?
  • 包含了#include <pthread.h>,为什么还有pthread_create错误?
  • 请问一下红色字体处的区别,及pthread_self()和pthread_creat()函数第一个参数的区别?
  • pthread_cond_wait 之前的 pthread_mutex_lock 语句 有什么作用,可以不用吗?
  • pthread_cancel和pthread_cond_wait
  • pthread_cond_t和pthread_mutex_t的疑问?
  • pthread_cond_t进入等待状态,则pthread_mutex_t无效...
  • LINUX关于pthread_create 和pthread_join
  • Pthread
  • pthread_create成功返回,但pthread_kill(thrdid, 0)返回说进程不存在?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3