|
每一个线程数据结构都有各自的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);
}
} |
|