当前位置: 技术问答>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写个一样的,然后合起来就可以跨平台了。...
无奈功力不够..请各位帮帮忙...功能想和那篇文章里写的一样..
代码有点多..
关键是线程函数 和停止,先贴这个..
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