linux的多任务编程-线程池,Linux的多任务编程-线程池

函数tpool_thread定义了工作线程的函数,其中真正与实际任务有关的只有一行代码:

(*(my_work->handler_routine))(my_work->arg);

即执行my_work->handler_routine指针指向的函数,并传入参数my_work->arg.其他的步骤都是为执行这个任务而进行的各种设置和准备.

void *tpool_thread(void *tpool)

{

tpool_work_t *my_work;

tpool_t *pool = (struct tpool *)tpool;

for(;;)

{/* 线程内循环 */

pthread_mutex_lock(&(pool->queue_lock));

/* 如果任务列表为0,并且线程池没有关闭,则一直等待,直到任务到来为止  */

while((pool->cur_queue_size == 0) && (!pool->shutdown))

{

pthread_cond_wait(&(pool->queue_not_empty), &(pool->queue_lock));

}

/* 线程池是否已经关闭,如果线程池关闭则线程自己主动关闭 */

if(pool->shutdown)

{

pthread_mutex_unlock(&(pool->queue_lock));

pthread_exit(NULL);      /*线程退出状态为空,主线程不捕获各副线程状态*/

}

my_work = pool->queue_head;

pool->cur_queue_size--;

/*将任务链表头部去掉,改任务正在处理中*/

if(pool->cur_queue_size == 0)

pool->queue_head = pool->queue_tail = NULL;

else

pool->queue_head = my_work->next;

/* 任务链表还没有满 */

if((!pool->do_not_block_when_full) &&\

(pool->cur_queue_size == (pool->max_queue_size - 1)))

{

pthread_cond_broadcast(&(pool->queue_not_full));

}

/*任务链表为空*/

if(pool->cur_queue_size == 0)

{

pthread_cond_signal(&(pool->queue_empty));

}

pthread_mutex_unlock(&(pool->queue_lock));

/*启动线程业务处理逻辑*/

(*(my_work->handler_routine))(my_work->arg);

free(my_work);

}

return(NULL);

}0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值