- 论坛徽章:
- 4
|
本帖最后由 linux_c_py_php 于 2012-10-04 12:28 编辑
linux_c_py_php 发表于 2012-10-04 12:00 ![]()
上边的方法是apache的MPM里使用的一种技巧, 一方面可以精确到单个线程的控制, 一方面保证主线程不会因为pth ...
像apache的MPM, 主线程做线程管理, listen线程做监听accept, worker线程负责连接处理, listen与worker间通过mutex+cond+queue交互, listen线程在queue满时挂起在cond, 直到被worker唤醒才继续accept, 以此达到控制连接数的目的.
我的意思就是, 怎么解决问题是根据问题自身来设计的, 没有通用的方法. 这里listen完全可能挂起在cond上, 这时候你怎么让一个挂起的线程退出? 只能让listen在挂起cond之前的检测中去检查一个变量, 我们想让listen退出的话只需要设置变量, 然后cond_signal唤醒listen让它去检查到这个变量, 才会让listen意识到退出, 其他办法似乎都没法解决, 因为程序就是这样的, 必须根据实际情况给出解决方案.
apache的worker进程退出又分暴力退出和优雅退出, 但这和楼主所说的暴力是两码事.
暴力退出是说listen和worker线程同时通知退出, 并且worker线程不完成当前的请求就从中途立即退出, 这一方面通过一个mutex保护的变量+cond_signal来通知整个worker线程池(防止有些此时已经挂起的), 另外需要设置一个全局原子变量, 每个worker线程在多个函数的失败返回点, 比如read等(errno == EINTR), 或者其他普通点铺设几个检测点, 一旦检测到原子量就立即清理连接并退出线程. listen线程一样, 我们依旧通过一个mutex保护的变量设置, 配置cond_signal唤醒, 之后listen线程也就退出了.
优雅退出是说只通知listen退出, 即先让listen停止接受新的连接, 之后由Listen向worker线程池通知退出, worker线程必须循环至queue中没有连接才会退出, 这样就避免了暴力退出给用户带来的不响应现象. |
|