文档章节

ApFree线程池

coreyggj
 coreyggj
发布于 2017/06/16 16:18
字数 850
阅读 12
收藏 0

WiFiDog项目是热门的针对captive portal 的开源解决方案(http://dev.wifidog.org),而ApFree则针对WiFiDog原有的功能进行了些扩展并进行了性能方面的优化(https://github.com/liudf0716/apfree_wifidog)。

线程池技术的应用就是ApFree针对WiFiDog在并行处理性能的改善。

在传统的多线程服务器模型中,一旦有个请求到达,就创建一个新的线程,由该线程执行任务,任务执行完毕之后,线程就退出,这就是"即时创建,即时销毁"的策略。虽然线程的创建和销毁相比进程的创建和销毁是轻量级的,但是当我们的任务需要进行大量线程的创建和销毁操作,或者线程任务的执行时间较短但次数较频繁,那么这些用于创建销毁线程的消耗就会变成的相当大。这个时候,线程池就可以很好的缓解系统的压力。

线程池的好处就在于线程复用,一个任务处理完成后,当前线程可以直接处理下一个任务,而不是销毁后再创建,非常适用于连续产生大量并发任务的场合。

ApFree里线程池相关的数据结构和API

struct threadpool_t {

  pthread_mutex_t lock;
  pthread_cond_t notify;
  pthread_t *threads;
  threadpool_task_t *queue;
  int thread_count;
  int queue_size;
  int head;
  int tail;
  int count;
  int shutdown;
  int started;

};
threadpool_t *threadpool_create(int thread_count, int queue_size, int flags);
int threadpool_add(threadpool_t *pool, void (*routine)(void *), void *arg, int flags);
int threadpool_destroy(threadpool_t *pool, int flags);

在 struct threadpool_t 中:

  1. 互斥锁lock和条件变量notify来实现对于线程池的互斥和唤醒操作
  2. threads 存储线程池中线程的实例
  3. 任务队列queue存储线程执行任务的回调函数和参数
  4. head、tail、count成员用于管理queue任务队列
  5. shutdown、started成员用于表达线程池的状态

工作原理

  1. threadpool_create创建指定个数的线程,相应线程通过pthread_cond_wait睡眠在条件变量notify上。
  2.  threadpool_add向任务队列queue中追加新的任务回调函数和参数,并通pthread_cond_signal唤醒等待在条件变量notify上的线程,继而进行任务的执行。

相关思考

  • 关于queue处于满的情况处理。 在ApFree的应用场景中由于并发数相对较少,并且对于客户连接的处理也相对简单,并不太会出现queue满的情况,所以ApFree中就做了简化处理:
 if (pool->count == pool->queue_size) {
      err = threadpool_queue_full;
      break;
 }

这样在用http_load测试时,一旦queue处于满状态就会出现错误 "Connection refused"。

针对一般的应用场景,我们可以采用以下几种方案作为对策:

  1. 增加关于queue队列状态的条件变量,一旦queue队列为满,那么接受客户连接的线程(主线程)就wait在这个条件变量上。这可能会导致在queue队列满的状况下,并发处理性能的急剧下降。
  2. 在queue队列满的情况下,一旦有新的任务被追加就通过创建新的线程来解决。这样内存的开销取决于最大的并发连接数,可能导致不必要的内存开销。
  3. 基于方案2,可以创建线程池管理线程来监控线程池的运行负载来动态调整线程池中线程数量。

© 著作权归作者所有

coreyggj
粉丝 1
博文 42
码字总数 19193
作品 0
无锡
程序员
私信 提问
WiFi 热点认证解决方案--ApFree WiFiDog

ApFree WiFiDog ApFree WiFiDog 在完全兼容原版 WiFiDog 的基础上,在功能、性能和稳定性方面做了大量工作、改进及优化,目前在坤腾固件中广泛使用,使用 ApFree WiFidog 的在线路由器数量达...

ApFree
2017/01/20
1K
2
ApFree WiFiDog 3.11.1715 版本发布

继 apfree wifidog 替换 libhttpd 库为 libevent 库后,apfree wifidog 再次发版本。 本次版本的主要改动是扩展了原来的 wifidog REQUEST_TYPE_COUNTERS(简称V1)接口为REQUEST_TYPE_COUNTE...

ApFree
2018/11/21
783
1
ApFree WiFiDog 3.8.1588 发布,支持 Openwrt 18.06 稳定分支

apfree-wifidog版本3.8.1588发布,主要更新内容如下: 修复了在openwrt 18.06以上版本会崩溃的问题 默认编译选项去掉了mqtt的支持,如要使用该功能需要修改编译选项 优化了libhttpd的网络传输...

ApFree
2018/09/10
697
1
ApFree WiFiDog 3.10.1696 发布,全面替换 libhttpd 重装上阵

本版本的最大改动就是将原来的 http server 支持库由原来的 libhttpd 替换成 libevent 来支持; libhttpd 作为一个开源轻量级的支持嵌入式设备的 http server 库,在早期的嵌入式设备上有比较...

ApFree
2018/11/06
943
1
ApFree/apfree_wifidog

About ApFree WiFiDog ApFree WiFiDog 在完全兼容原版WiFiDog的基础上,在功能、性能和稳定性方面做了大量工作、改进及优化。 由于ApFree WiFiDog完全兼容原有的WiFiDog协议,在将原有WiFiD...

ApFree
2017/01/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql已存在的表增加自增字段

需求: 已有的mysql数据表,希望增加一个自增的字段,并设置新数据的初始值。 实际上不复杂,只是做个备忘。 测试表 CREATE TABLE `t_abc` ( `name` varchar(20) DEFAULT NULL) ENGINE=In...

polly
28分钟前
1
0
去掉截屏功能

/home/rk3288_600_f703/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java 有一个截屏的线程,注释掉...

安卓工程师王恒
36分钟前
0
0
解决vim打开之后乱码的问题

在Windows中的文档,传输到Linux系统中(使用rz命令),出现乱码 root@localhost ~]# rpm -qf `which iconv` glibc-common-2.17-105.el7.x86_64 [root@localhost ~]# rpm -ihv /mnt/Packages......

寰宇01
53分钟前
2
0
aldi 2017年1月记录

../../tools/CBLAS/lib/cblas_LINUX.a ../../tools/lapack-3.4.2/liblapacke.a \../../tools/lapack-3.4.2/librefblas.a -lgfortran \../../tools/lapack-3.4.2/liblapack.a \../../......

MtrS
54分钟前
3
0
Choerodon如何进行日志收集与告警

作者:董文启 应用程序日志是由软件应用程序记录的事件文件, 它一般包含错误,信息事件和警告。一个良好的日志系统有助于快速发现问题,定位问题,同时也为业务分析起到一定的作用。 传统E...

Choerodon
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部