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

请教关于pthread的问题.

    来源: 互联网  发布时间:2016-07-20

    本文导语:  本帖最后由 wheresky 于 2009-11-25 18:30:43 编辑 看了篇http://blog.csdn.net/aa211314/archive/2008/03/31/2234401.aspx,抽像出来的一个windows线程管理类,感觉结构蛮简单方便的,于是就想用pthread写个一样的,然后合起来就可以跨平台了。...

本帖最后由 wheresky 于 2009-11-25 18:30:43 编辑
看了篇http://blog.csdn.net/aa211314/archive/2008/03/31/2234401.aspx,抽像出来的一个windows线程管理类,感觉结构蛮简单方便的,于是就想用pthread写个一样的,然后合起来就可以跨平台了。
无奈功力不够..请各位帮帮忙...功能想和那篇文章里写的一样..

代码有点多..
关键是线程函数 和停止,先贴这个..
Mutex,condition都单独封装成类了,没几个函数,方便调用..




unsigned long LinuxThread::WorkThread(void * lpParameter)
{
LinuxThread * pThis = (LinuxThread*) lpParameter;
if (pThis == NULL) return -1;
for (;;)
{
if (pThis->m_CycleTime > AlwaysWork)
{
pThis->m_mutex.Lock();    
threadflag ++;
pThis->m_cond.timedWait(pThis->m_CycleTime/1000, pThis->m_CycleTime%1000, &(pThis->m_mutex.getMutex()));          //等待时间
threadflag --;
pThis->m_mutex.Unlock();
}
else if (pThis->m_CycleTime m_mutex.Lock();        //总是等待
threadflag ++;
pThis->m_cond.wait(&(pThis->m_mutex.getMutex()));
pThis->m_mutex.Unlock();
}


if (pThis->m_ThreadCmd == stop)   //线程退出标记
{            

return 0;
}


if (pThis->m_WorkFunction != NULL)   
{
try
{
(*pThis->m_WorkFunction)(pThis->m_lpParameter);  //我们要运行的方法
}
catch (...)
{
}
}
}

return -2;
}



void LinuxThread::Stop()
{
if (m_hThread==0)             //如果线程id=0
{
return;
}  

m_ThreadCmd = stop;          //线程内部的退出标记
WorkNow();            //设置标记,唤醒阻塞的线程..
pthread_join(m_hThread, NULL);    //然后等待线程自己很出


m_ThreadCmd = nothing;
m_hThread = 0;
}




void LinuxThread::WorkNow()
{

if (m_hThread == 0)
{
Start();           //如果线程没有运行,开个新的,一般用不到.
m_mutex.Lock();
while (true)
{
if (threadflag > 0)       //设置threadflag,据说是因为pthread_cond_signal,如果没
//有阻塞的线程在等待,直接就返回了,所以加个循环,看别的网页上说的。
{

m_cond.signal();
break;
}

}

m_mutex.Unlock();

}
else            //如果线程正在运行.., 进行退出.
{
m_mutex.Lock();               
while (true)
{
if (threadflag > 0)
{
m_cond.signal();
break;
}                    

}

m_mutex.Unlock();
}

}





现在每次都会卡死主线程,不知道哪里阻塞了...很郁闷...
单步调试就正常的,对condition,mutex运用的不太熟练...

|

|

|
线程类的声明呢

|
最好可以有一个整体的概念

|
你的代码不太详细了,看不出你的thread类的工作全貌.

|
学习一下 顶一个

|
就那么一段  没那本事找出来问题在那里 帮顶

|
mark

    
 
 

您可能感兴趣的文章:

  • 请教一个pthread线程库的使用的问题
  • 关于pthread_mutex_lock的问题,请教各位
  • 请教:pthread_join( )在等待一个已经退出的线程时为何会导致死锁?
  • 请教sleep和pthread_delay_np:阻塞线程/阻塞进程?
  • 请教:pthread_mutex_lock()后加sleep(1)=解锁?
  • 重分请教: fedora core 5中如何使用 pthread_suspend_np?是否需要外部库支持?
  • c++程序中使用pthread编译不过,请教大家?????
  • 请教大家,pthread线程的问题??
  • [请教]pthread_create多线程问题
  • 请教关于pthread的程序 编译通不过,谢谢
  • 再加100分..请教Pthread的问题
  • 请教:pthread_mutex_lock()后加sleep(1)=解锁? iis7站长之家
  • 关于pthread_join()例子,请教高手。
  • 请教本地硬盘安装问题请教本地硬盘安装问题
  • 请教,请教,这个问题是为什么????
  • ■请教■请教redhat最基本的问题!
  • 请教一个 shell 问题,我用下面这个 shell 语句总是失败,请教
  • 高分请教,各位大侠,请教一个问题,理论高手请进??谢谢
  • 请教象我这样的硬盘应如何安装Linux,我昨天试装了,但有问题。(老问题了,也看了前面的帖子,但还是来请教,请多指教)
  • 请教一个函数入口处的汇编问题(压栈问题)
  • 请教!出现这个提示是什么原因..是模块版本问题,还是其他问题..http://220.114.102.28/xitong/ProductShow.asp?ArticleID=82
  • 请教两个小问题:一个cgywin下使用vi的问题,另一个socket的问题
  • 请教一个opengl的问题
  • 请教两个redhat9问题
  • 请教kdevelop的问题
  • 送上100分问题请教,同时学习一下进程通讯问题,望各位不吝赐教
  • 请教linux 下的adsl拨号问题.
  • 请教unix常用命令命令问题
  • 请教,帖子回复的显示问题
  • 请教关于sendto问题
  • 请教linux共享上网的问题!!!在线等,问题解决马上结贴
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请教Linux下pgadmin3-1.0.2的编译和安装!!高分请教!
  • 各位大虾,请教装了REDHAT9操作系统后,启动时无法引导到LINUX,请教该如何解决啊
  • 请教,请教,,,一定要看!!一定要看!!
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教这种循环的执行过程
  • 请教如何在指定目录下查找包含指定文字的文件
  • 请教局域网中如何通过ip地址得到主机名
  • 请教,如何用虚拟订机安装liux
  • 【请教】LINUX 下SNMP的MIB开发
  • 请教两个shell
  • 请教高手:如何用gnome/gtk编写托盘程序
  • 菜鸟请教Linux
  • 请教semop()函数的用法、含义
  • 请教个,关于C编译器参数CFLAGS的问题(真诚请教,分不够了全部送出)
  • 请问如何在Redhat7.1下安装Ftp服务,如何开启Ftp帐号????请教!!!急急急急急急
  • Think in java 问题。(请教)
  • 请教下我的eth0为什么设置后重启会失败?
  • 请教:$PWD 这个东西是什么意思啊?谢谢!
  • 请教高手AIX中怎么删除行尾的字符^M


  • 站内导航:


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

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

    浙ICP备11055608号-3