在windows下使用pthreads。 如果等待另外一个线程结束的话,用pthread_join 和pthread_cond_wait哪个更好?

sblsongdongf 2008-01-22 05:40:46
我使用的是pthreads-w32-2-8-0-release。我的程序是一个dll,被别人的exe调用。核心类叫做CProcessor。
Class CProcessor
{

//...
bool active;
bool terminated;//线程结束标志
pthread_t threadId;
pthread_mutex_t mutex;
pthread_cond_t cond;
static void* AlgoThreadFunc(void* data);
//...
};

我在构造函数中创建子线程
active = true;
terminated = false;
int result = pthread_create(&(this->threadId), NULL, AlgoThreadFunc, (void*)this);

在析构函数中等待子线程结束---必须等待,因为AlgoThreadFunc中涉及很多资源分配。
我采用pthread_cond_wait来等待
active = false;
if (!terminated)
{
pthread_mutex_lock(&mutex);//lock
pthread_cond_wait(&cond, &mutex);//wait for signal
pthread_mutex_unlock(&mutex);
}
//...

线程体结构如下
void* CProcessor::AlgoThreadFunc(void* data)
{
CProcessor* processor = (CProcessor*) data;
if (processor)
{
while (processor->isActive())
{
//有意义的代码,此处略
Sleep(5);
}

//发消息通知主线程
pthread_cond_signal(&(processor->cond));
processor->terminated = true;
}

return NULL;
}

但是我在运行时发现用户关闭程序时,析构函数未执行完,程序僵死不释放资源。
...全文
492 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
nicklgw 2011-08-10
  • 打赏
  • 举报
回复
pthreads-w32-2-8-0-release这个怎么加载到VS2008编译器中,让它能够工作了?
knowledge_Is_Life 2008-05-01
  • 打赏
  • 举报
回复
我也想知道,正在找這方面的資料~~~~~
Arthur_ 2008-02-03
  • 打赏
  • 举报
回复
pthread_cond_wait 等代一个信号,但是如果这个信号没有发送过来就会导致死等(用的时候小心)
pthread_join 一直等到线程结束,如果任务很简单这个比较好
pthread_cond_timedwait这个多个超时机制,与第一个相比唯一的缺点是使用前需要lock一下



根据需要了
boxban 2008-02-01
  • 打赏
  • 举报
回复
>>这类问题的妥善方法是怎样的呢?我的程序里CProcessor负责分析一帧图像,耗时也耗内存
1. 对于 pthread_cond_wait 的使用
注意调用次序:
lock mutex;
create worker thread
call pthread_cond_wait(&cond, &mutex);
否则有丢失COND-SIGNAL 信号的机会

2. 关于在构造函数中创建线程
如果真的需要一个类来封装整个线程,可以考虑采用一种迂回策略:
定义个C 函数,比如叫做:pthead_t createImageProcessThread( CProcessor*);
在创建线程时,将CProcessor作为线程参数传入即可。
这样做的好处是:调用者很容易知道他/她正在创建一个线程
sblsongdongf 2008-01-30
  • 打赏
  • 举报
回复
To babyvox1999:僵死在pthread_cond_wait(&cond, &mutex);//wait for signal
sblsongdongf 2008-01-30
  • 打赏
  • 举报
回复
谢谢boxban,这类问题的妥善方法是怎样的呢?我的程序里CProcessor负责分析一帧图像,耗时也耗内存
babyvox1999 2008-01-24
  • 打赏
  • 举报
回复
调试设置端点。。。看死在哪里
boxban 2008-01-23
  • 打赏
  • 举报
回复
估计这和你调用析构函数的时机有关系:
如果在线程结束后调用析构函数,可能会导致线程函数里的COND-SIGNAL信号丢失的问题。另外,如果线程函数执行的时间过短,也可能会导致类似的问题。

另外,在构造函数中创建线呈或者在析构函数中等待线程结束都不是典型的编程范例:对于这个类的使用者来讲,阻塞在一个析构函数上会感觉比较奇怪 ;-)
星羽 2008-01-23
  • 打赏
  • 举报
回复
up

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧