<acronym id='l8p2w'><em id='l8p2w'></em><td id='l8p2w'><div id='l8p2w'></div></td></acronym><address id='l8p2w'><big id='l8p2w'><big id='l8p2w'></big><legend id='l8p2w'></legend></big></address>

    <code id='l8p2w'><strong id='l8p2w'></strong></code>
    <i id='l8p2w'><div id='l8p2w'><ins id='l8p2w'></ins></div></i>

  1. <tr id='l8p2w'><strong id='l8p2w'></strong><small id='l8p2w'></small><button id='l8p2w'></button><li id='l8p2w'><noscript id='l8p2w'><big id='l8p2w'></big><dt id='l8p2w'></dt></noscript></li></tr><ol id='l8p2w'><table id='l8p2w'><blockquote id='l8p2w'><tbody id='l8p2w'></tbody></blockquote></table></ol><u id='l8p2w'></u><kbd id='l8p2w'><kbd id='l8p2w'></kbd></kbd>
    1. <dl id='l8p2w'></dl>
      <i id='l8p2w'></i>
        <fieldset id='l8p2w'></fieldset>
        <span id='l8p2w'></span>
        1. <ins id='l8p2w'></ins>

          Linux线程池使用

          • 时间:
          • 浏览:8
          • 来源:124软件资讯网

            一、线程池概述

            线程池是一种多线程处置惩罚形式  ,处置惩罚历程中将使命添加到行列  ,然后在建立线程后自动启动这些使命  。线程池线程都是后台线

            程  。每个线程都使用默认的客栈巨细  ,以默认的优先级运行,并处于多线程单元中  。若是某个线程在托管代码中空闲(如正在等候

            某个事务) ,则线程池将插入另一个辅助线程来使所有处置惩罚器保持忙碌 。若是所有线程池线程都始终保持忙碌,但行列中包罗挂起

            的事情 ,则线程池将在一段时间后建立另一个辅助线程但线程的数目永远不会凌驾最大值 。凌驾最大值的线程可以排队  ,但他们

            要等到其他线程完成后才启动 。应用法式可以有多个线程  ,这些线程在休眠状态中需要泯灭大量时间来等候事务发生  。其他线程

            可能进入睡眠状态  ,而且仅定期被叫醒以轮循更改或更新状态信息 ,然后再次进入休眠状态  。为了简化对这些线程的治理  ,为每

            个历程提供了一个线程池 ,一个线程池有若干个等候操作状态  ,当一个等候操作完成时  ,线程池中的辅助线程会执行回调函数  。

            线程池中的线程由系统治理  ,法式员不需要艰苦于线程治理 ,可以集中精神处置惩罚应用法式使命 。

            使用线程池的利益:

            1、淘汰在建立和销毁线程上所花的时间以及系统资源的开销;

            2、如不使用线程池 ,有可能造成系统建立大量线程而导致消耗完系统内存以及”过分切换”  。

            在什么情形下使用线程池:

            1、单个使命处置惩罚的时间比力短;

            2、将需处置惩罚的使命的数目大  。

            在什么情形下不使用线程池线程:

            1、若是需要使一个使命具有特定优先级;

            2、若是具有可能会长时间运行(并因此壅闭其他使命)的使命;

            3、若是需要将线程放置到单线程单元中(线程池中的线程均处于多线程单元中);

            4、若是需要永世标识来标识和控制线程  ,好比想使用专用线程来终止该线程  ,将其挂起或按名称发现它 。

            二、线程池法式

            main.c

            #include #include #include "thread_pool.h"/**********************************************************************功效:      使命处置惩罚函数*参数:	  无*返回值:    NULL*********************************************************************/void *task_test(void *arg){	printf("/t/tworking on task %d/n", (int)arg);	sleep(1);	  /*休息一秒  ,延伸使命的执行时间*/	return NULL;}int main (int argc, char *argv[]){  	pool_t pool;	int i = 0;	pool_init(&pool, 2);//初始化线程池	sleep(1);	for(i = 0; i < 5; i++){		sleep(1);		pool_add_task(&pool, task_test, (void *)i);//向线程池中添加一个使命	}	sleep(4);	pool_uninit(&pool);//销毁线程池	return 0;}


            thread_pool.c

            #include #include #include #include #include "thread_pool.h"static void *pool_thread_server(void *arg);/**********************************************************************功效:    初始化线程池结构体并建立线程*参数:    pool:线程池句柄*        threads_limit:线程池中线程的数目*返回值:	无*********************************************************************/void pool_init(pool_t *pool, int threads_limit){	pool->threads_limit = threads_limit;	pool->queue_head = NULL;	pool->task_in_queue = 0;	pool->destroy_flag = 0;	/*建立存放线程ID的空间*/	pool->threadid = (pthread_t *)calloc(threads_limit, sizeof(pthread_t));	int i = 0;	/*初始化互斥锁和条件变量*/	pthread_mutex_init(&(pool->queue_lock), NULL);	pthread_cond_init(&(pool->queue_ready), NULL);	/*循环建立threads_limit个线程*/	for (i = 0; i < threads_limit; i++){		pthread_create(&(pool->threadid[i]), NULL, pool_thread_server, pool);	}	return;}/**********************************************************************功效:    销毁线程池 ,等候行列中的使命不会再被执行 ,*        可是正在运行的线程会一直,把使命运行完后再退出*参数:    线程池句柄*返回值:  乐成:0 ,失败非0*********************************************************************/int pool_uninit(pool_t *pool){	pool_task *head = NULL;	int i;		pthread_mutex_lock(&(pool->queue_lock));	if(pool->destroy_flag)/* 防止两次挪用 */		return -1;	pool->destroy_flag = 1;	pthread_mutex_unlock(&(pool->queue_lock));	/* 叫醒所有等候线程  ,线程池要销毁了 */	pthread_cond_broadcast(&(pool->queue_ready));	/* 壅闭等候线程退出  ,否则就成僵尸了 */	for (i = 0; i < pool->threads_limit; i++)		pthread_join(pool->threadid[i], NULL);	free(pool->threadid);	/* 销毁等候行列 */	pthread_mutex_lock(&(pool->queue_lock));	while(pool->queue_head != NULL){		head = pool->queue_head;		pool->queue_head = pool->queue_head->next;		free(head);	}	pthread_mutex_unlock(&(pool->queue_lock));	/*条件变量和互斥量也别忘了销毁*/	pthread_mutex_destroy(&(pool->queue_lock));	pthread_cond_destroy(&(pool->queue_ready));	return 0;}/**********************************************************************功效:    向使命行列中添加一个使命*参数:    pool:线程池句柄*        process:使命处置惩罚函数*        arg:使命参数*返回值:	无*********************************************************************/static void enqueue_task(pool_t *pool, pool_task_f process, void *arg){	pool_task *task = NULL;	pool_task *member = NULL;		pthread_mutex_lock(&(pool->queue_lock));		if(pool->task_in_queue >= pool->threads_limit){		printf("task_in_queue > threads_limit!/n");		pthread_mutex_unlock (&(pool->queue_lock));		return;	}		task = (pool_task *)calloc(1, sizeof(pool_task));	assert(task != NULL);	task->process = process;	task->arg = arg;	task->next = NULL;	pool->task_in_queue++;	member = pool->queue_head;	if(member != NULL){		while(member->next != NULL)	/* 将使命加入到使命链连的最后位置. */			member = member->next;		member->next = task;	}else{		pool->queue_head = task;	/* 若是是第一个使命的话,就指向头 */	}	printf("/ttasks %d/n", pool->task_in_queue);	/* 等候行列中有使命了 ,叫醒一个等候线程 */	pthread_cond_signal (&(pool->queue_ready));	pthread_mutex_unlock (&(pool->queue_lock));}/**********************************************************************功效:    从使命行列中取出一个使命*参数:    线程池句柄*返回值:	使命句柄*********************************************************************/static pool_task *dequeue_task(pool_t *pool){	pool_task *task = NULL;		pthread_mutex_lock(&(pool->queue_lock));	/* 判断线程池是否要销毁了 */	if(pool->destroy_flag){		pthread_mutex_unlock(&(pool->queue_lock));		printf("thread 0x%lx will be destroyed/n", pthread_self());		pthread_exit(NULL);	}	/* 若是等候行列为0而且不销毁线程池  ,则处于壅闭状态 */	if(pool->task_in_queue == 0){		while((pool->task_in_queue == 0) && (!pool->destroy_flag)){			printf("thread 0x%lx is leisure/n", pthread_self());			/* 注重:pthread_cond_wait是一个原子操作  ,等候前会解锁  ,叫醒后会加锁 */			pthread_cond_wait(&(pool->queue_ready), &(pool->queue_lock));		}	}else{		/* 等候行列长度减去1  ,并取出行列中的第一个元素 */		pool->task_in_queue--;		task = pool->queue_head;		pool->queue_head = task->next;		printf("thread 0x%lx received a task/n", pthread_self());	}	pthread_mutex_unlock(&(pool->queue_lock));	return task;}/**********************************************************************功效:    向线程池中添加一个使命*参数:    pool:线程池句柄*        process:使命处置惩罚函数*        arg:使命参数*返回值:	0*********************************************************************/int pool_add_task(pool_t *pool, pool_task_f process, void *arg){	enqueue_task(pool, process, arg);	return 0;}/**********************************************************************功效:    线程池服务法式*参数:    略*返回值:  略*********************************************************************/static void *pool_thread_server(void *arg){	pool_t *pool = NULL;		pool = (pool_t *)arg;	while(1){		pool_task *task = NULL;		task = dequeue_task(pool);		/*挪用回调函数  ,执行使命*/		if(task != NULL){			printf ("thread 0x%lx is busy/n", pthread_self());			task->process(task->arg);			free(task);			task = NULL;		}	}	/*这一句应该是不行达的*/	pthread_exit(NULL);	 	return NULL;}


            thread_pool.h

            #ifndef __THREAD_POOL_H__#define __THREAD_POOL_H__#include /********************************************************************** 使命回调函数  ,也可凭据需要自行修改*********************************************************************/typedef void *(*pool_task_f)(void *arg);/********************************************************************** 使命句柄*********************************************************************/typedef struct _task{	pool_task_f process;/*回调函数 ,使命运行时会挪用此函数  ,注重也可声明成其它形式*/	void *arg;          /*回调函数的参数*/	struct _task *next;}pool_task;/********************************************************************** 线程池句柄*********************************************************************/typedef struct{	pthread_t *threadid;		/* 线程号 */	int threads_limit;			/* 线程池中允许的运动线程数目 */	int destroy_flag;			/* 是否销毁线程池 , 0销毁  ,1不销毁*/	pool_task *queue_head;	    /* 链表结构  ,线程池中所有等候使命 */	int task_in_queue;			/* 当前等候行列的使命数目 */	pthread_mutex_t queue_lock;	/* 锁 */	pthread_cond_t queue_ready;	/* 条件变量 */}pool_t;/**********************************************************************功效:    初始化线程池结构体并建立线程*参数:    pool:线程池句柄*        threads_limit:线程池中线程的数目*返回值:	无*********************************************************************/void pool_init(pool_t *pool, int threads_limit);/**********************************************************************功效:    销毁线程池  ,等候行列中的使命不会再被执行  ,*        可是正在运行的线程会一直,把使命运行完后再退出*参数:    线程池句柄*返回值:	乐成:0  ,失败非0*********************************************************************/int pool_uninit(pool_t *pool);/**********************************************************************功效:    向线程池中添加一个使命*参数:    pool:线程池句柄*        process:使命处置惩罚函数*        arg:使命参数*返回值:	0*********************************************************************/int pool_add_task(pool_t *pool, pool_task_f process, void *arg);#endif