LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1127|回复: 4

LINUX 线程池 我的线程有时候不返回

[复制链接]
发表于 2006-12-2 16:17:00 | 显示全部楼层 |阅读模式
每一个线程数据结构都有各自的mutex和cond
程序:

void *thread(void *p)
{
        THREAD_NODE *tn;
        TASK_NODE *task;
        RESOURCE_NODE *rn;
        int fd, type;

        tn = (THREAD_NODE *)p;

        pthread_mutex_lock(&(tn->ctl).ctl.mutex);          //该线程的mutex一直保持
        while(1)
        {
                while(tn->ctl.banner == THREAD_IDLE)
                {
                        pthread_cleanup_push(cancel, (void *)&tn->ctl);
                        pthread_cond_wait(&(tn->ctl).ctl.cond, &(tn->ctl).ctl.mutex);
                        pthread_cleanup_pop(0);
                }
                if(tn->task == NULL)
                {
                        continue;
                }
//do the task start
                (tn->task->handle)(tn->task);            //做真正的任务
//do the task end
                tn->ctl.banner = THREAD_IDLE;
                tn->status = THREAD_IDLE;
                task = tn->task;
                tn->task = NULL;
                fd = task->rn->sock.fd;
                type = task->rn->sock.type;

                pthread_mutex_lock(&rp.mutex);        //释放资源,rp是资源池,rp可能被另一   个线程使用
                releasetask(task);
                pthread_mutex_unlock(&rp.mutex);
        }
}
 楼主| 发表于 2006-12-2 23:26:54 | 显示全部楼层
我用gdb调试了一下,我的线程在执行了pthread_cond_wait()的时候,好像不解锁.

以至于在线程外调用pthread_mutex_trylock()时,得不到锁,这个线程就不会运行了.而且,外部执行
ptread_cancel()时,这个线程也不会退出.


好郁闷.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-2 23:29:23 | 显示全部楼层
急切指导.



谢谢!
回复 支持 反对

使用道具 举报

发表于 2006-12-3 15:55:00 | 显示全部楼层
代码不全似乎!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-3 16:19:16 | 显示全部楼层
恩,这是我的线程池中的线程,另外还有任务池线程,切换线程.

就是在切换线程中调用pthread_mutex_trylock()的,但是锁不住啊.


是不是因为每一个线程都有一个互斥锁,当线程比较多时,会出现问题.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表