一、概述
在当今强调多核开发的年代,要求程序员能够写出高并发的程序,而利用多个核一般有两种方式:采用多线程方式或多进程方式。每处理一个新任务时如果临时产生一个线程或进程且处理完任务后线程或进程便立即退出,显示这种方式是非常低效的,于是人们一般采用线程池的模型(这在JAVA 或 .NET 中非常普遍)或多进程进程池模型(这一般在UNIX平台应用较多)。此外,对于线程池或进程池模型又分为两种情形:常驻留内存或半驻留内存,常驻内存是指预先产生一批线程或进程,等待新任务到达,这些线程或进程即使在空闲状态也会常驻内存;半驻留内存是指当来新任务时如果线程池或进程池没有可利用线程或进程则启动新的线程或进程来处理新任务,处理完后,线程或进程并不立即退出,而是空闲指定时间,如果在空闲阀值时间到达前有新任务到达则立即处理新任务,如果到达空闲超时后依然没有新任务到达,则这些空闲的线程或进程便退出,以让出系统资源。所以,对比常驻内存方式和半驻留内存方式,不难看出半驻留方式更有按需分配的意味。
下面仅以ACL框架中的半驻留线程池模型为例介绍了如何写一个半驻留线程池的程序。
二、半驻留线程池函数接口说明
2.1)线程池的创建、销毁及任务添加等接口
C代码
/**
* 创建一个线程池对象
* @param attr {acl_pthread_pool_attr_t*} 线程池创建时的属性,如果该参数为空,
* 则采用默认参数: ACL_PTHREAD_POOL_DEF_XXX
* @return {acl_pthread_pool_t*}, 如果不为空则表示成功,否则失败
*/
ACL_API acl_pthread_pool_t *acl_pthread_pool_create(const acl_pthread_pool_attr_t *attr);
/**
* 销毁一个线程池对象, 成功销毁后该对象不能再用.
* @param thr_pool {acl_pthread_pool_t*} 线程池对象,不能为空
* @return {int} 0: 成功; != 0: 失败
*/
ACL_API int acl_pthread_pool_destroy(acl_pthread_pool_t *thr_pool);
/**
* 向线程池添加一个任务
* @param thr_pool {acl_pthread_pool_t*} 线程池对象,不能为空
* @param run_fn {void (*)(*)} 当有可用工作线程时所调用的回调处理函数
* @param run_arg {void*} 回调函数 run_fn 所需要的回调参数
* @return {int} 0: 成功; != 0: 失败
*/
ACL_API int acl_pthread_pool_add(acl_pthread_pool_t *thr_pool,
void (*run_fn)(void *), void *run_arg);
/**
* 当前线程池中的线程数
* @param thr_pool {acl_pthread_pool_t*} 线程池对象,不能为空
* @return {int} 返回线程池中的总线程数
*/
ACL_API int acl_pthread_pool_size(acl_pthread_pool_t *thr_pool);
版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明!