当前位置: 技术问答>linux和unix
关于LINUX线程池的请教
来源: 互联网 发布时间:2017-01-26
本文导语: 线程池的技术从网上收罗到一大堆的文章,不过文章基本上都是点点滴滴、思路各有不同,不完整甚至不能保持思路正确。特来此求教各位线程池熟悉的高手: 1、 线程池的基础框架 2、 C++具体的框架流程 3、 逻...
线程池的技术从网上收罗到一大堆的文章,不过文章基本上都是点点滴滴、思路各有不同,不完整甚至不能保持思路正确。特来此求教各位线程池熟悉的高手:
1、 线程池的基础框架
2、 C++具体的框架流程
3、 逻辑架构
最好能给一个正统系统的思路,不要人云亦云不知所云。我是线程池菜鸟,系统学习中。
谢谢!
这里的两篇文章,我看过之后还是举得他讲的有些漏洞,有些地方也是一家之言。
Linux下通用线程池的创建与使用:
http://blog.sina.com.cn/s/blog_436fe8b10100rn7w.html
http://blog.sina.com.cn/s/blog_436fe8b10100rn7z.html
1、 线程池的基础框架
2、 C++具体的框架流程
3、 逻辑架构
最好能给一个正统系统的思路,不要人云亦云不知所云。我是线程池菜鸟,系统学习中。
谢谢!
这里的两篇文章,我看过之后还是举得他讲的有些漏洞,有些地方也是一家之言。
Linux下通用线程池的创建与使用:
http://blog.sina.com.cn/s/blog_436fe8b10100rn7w.html
http://blog.sina.com.cn/s/blog_436fe8b10100rn7z.html
|
额... 你站的太高了, 必须仰望你了.
别让C++把自己给束缚了... 一开始就想这些就把人累死了...
1, 线程池就是一堆线程, 没任务就阻塞着.
2, 任务就是一个结构体, 内含数据, 以及处理数据的函数指针, 为了通用性, 大致写成这样:
struct task
{
void *data; //数据
int (*handler)(void *ctx); //处理数据
};
这样就把不同类型的任务抽象出来了, 用户指定方法, 提供数据就行了.
3, 任务的分派, 线程的管理. 这里就看需求了, 处理办法也很多样.
①可以做任务队列(mutex+cond),让线程池去竞争。
②可以做事件驱动的, 也就是每个线程自己做select等待任务分发, 每个线程有自己的任务队列,这种方法控制更加简单灵活,可控性很强。
线程的管理方面工作不一定很复杂,可以在①的模型下外加一个变量来做控制, 也可以利用信号来做控制,都是摆脱不掉全局变量的互斥访问的, 尤其在线程控制这一块, 比进程控制要麻烦的多。
线程退出与否,没有办法获得,不像进程那样调用一个非阻塞的waitpid试探一下就可以了,一旦没有线程退出而调用了pthread_join就会阻塞,而且join没法被信号中断, 也就没法设计setitime来按周期中断阻塞,所以必须维护全局信息来记录线程的退出状况,控制线程必须定期轮询,这是目前web服务器必然的设计方式,也就是控制线程必须轮询,不可能有一种方法达到完全的异步。
线程池管理比较简单灵活可控的是方法②,按照我的想法是完全可以异步的,主控线程和线程池完全的异步,主控线程当然也需要轮询,目的是及时跟进线程池状态,以便进行线程数量控制。
我前几天还写过一个进程控制框架,可以简单的看一下:
http://www.cnblogs.com/owenliang/
别让C++把自己给束缚了... 一开始就想这些就把人累死了...
1, 线程池就是一堆线程, 没任务就阻塞着.
2, 任务就是一个结构体, 内含数据, 以及处理数据的函数指针, 为了通用性, 大致写成这样:
struct task
{
void *data; //数据
int (*handler)(void *ctx); //处理数据
};
这样就把不同类型的任务抽象出来了, 用户指定方法, 提供数据就行了.
3, 任务的分派, 线程的管理. 这里就看需求了, 处理办法也很多样.
①可以做任务队列(mutex+cond),让线程池去竞争。
②可以做事件驱动的, 也就是每个线程自己做select等待任务分发, 每个线程有自己的任务队列,这种方法控制更加简单灵活,可控性很强。
线程的管理方面工作不一定很复杂,可以在①的模型下外加一个变量来做控制, 也可以利用信号来做控制,都是摆脱不掉全局变量的互斥访问的, 尤其在线程控制这一块, 比进程控制要麻烦的多。
线程退出与否,没有办法获得,不像进程那样调用一个非阻塞的waitpid试探一下就可以了,一旦没有线程退出而调用了pthread_join就会阻塞,而且join没法被信号中断, 也就没法设计setitime来按周期中断阻塞,所以必须维护全局信息来记录线程的退出状况,控制线程必须定期轮询,这是目前web服务器必然的设计方式,也就是控制线程必须轮询,不可能有一种方法达到完全的异步。
线程池管理比较简单灵活可控的是方法②,按照我的想法是完全可以异步的,主控线程和线程池完全的异步,主控线程当然也需要轮询,目的是及时跟进线程池状态,以便进行线程数量控制。
我前几天还写过一个进程控制框架,可以简单的看一下:
http://www.cnblogs.com/owenliang/
|
...菜鸟觉得很复杂, 我这种小鸟觉得线程池没什么难度..想咋整就咋整.
|
这个没什么说的... 什么需求做成什么样...
|
你有什么设计想法说出来讨论讨论得了.