Linux的多任务编程(4)

函数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);
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/2171544ed330f750996edb69a5ca4e43.html