首页 > 学技术 > 技术网文 > C/C++ > 正文

[原创] 线程池 + epoll 简单的实现


来源 chinaunix.net kuqin整理

这只是一个线程池的框架还有许多不足 : 没有实现server->client数据发送 , 还有许多细节没有完善。

Lock.cpp :      锁的操作 , 读锁可以并发 , 写锁独占.
Queue.h  :      队列的封装 , 队列的读和写都加了锁的保护.
Socket.cpp :   套接口的简单封装.
Thread.cpp :   线程的封装实现了些简单的线程停止,运行等功能 , 启动别的线程的时候需要继承次类.
Worker.cpp :  用户接口类 , 用户需继承此类。
ListenThread.cpp(继承Thread.cpp) : 服务器监听线程.如果有客户端连接通知ThreadPool类,由ThreadPool类进行任务分派.
TaskThread.cpp(继承Thread.cpp) : 具体任务类,负责接受客户端发送数据.
ThreadPool.cpp (继承Thread.cpp) : 线程池类负责启动别的线程 , 并且进行线程调度。首先启动ListenThread.cpp类,如果有客户端
连接ListenThread.cpp类发送信号通知ThreadPool.cpp类,收到信号再分配给TaskThread.cpp类,进行处理。如果没有空闲任务类,动态再
创建一定数目的任务类。

希望大家指出还有什么不好的地方 , 可以修改。
多谢
msn: [email]guo.zm1983@hotmail.com[/email]

[ 本帖最后由 ruchong 于 2007-6-12 18:10 编辑 ]

MyLinuxThread5-25.tar.gz



 converse 回复于:2007-05-17 23:46:27

鼓励一下。


 zylinux 回复于:2007-05-18 09:13:48

前段时间 在一家公司试用期 他们就写有关于线程池的开发项目
我一去看了一个 月的代码呢 呵呵 
看看 你的   呵呵  短时间不一定能完全看懂哦


 zylinux 回复于:2007-05-18 09:20:34

印度人都有RPWT。这个是什么意思?
呵呵


 zylinux 回复于:2007-05-18 09:34:09

不好意思 发 错拉


 ruchong 回复于:2007-05-18 09:41:27

其实这个代码挺简单的啊。
想到哪写到哪,以后再慢慢修改修改。
也希望各位指点一下。


 duanjigang 回复于:2007-05-18 13:44:59

不是吧,楼主的思想跟我的居然接近到让我惊叹的地步!
有些文件名都一样!
呵呵,等我把自己那个线程池整理整理发上来,互相参考参考


 ruchong 回复于:2007-05-18 13:48:34

哈哈,好的好的。
互相学习学习。
还没想好server->client怎么传啊,正好学习学习。


 zhujiang73 回复于:2007-05-18 15:00:51

引用:原帖由 ruchong 于 2007-5-17 22:14 发表
这只是一个线程池的框架还有许多不足 : 没有实现server->client数据发送 , 还有许多细节没有完善。

Lock.cpp :      锁的操作 , 读锁可以并发 , 写锁独占.
Queue.h  :      队列的封装 , 队列的读和写都加 ... 



支持原创,希望有比较详细的应用例子程序。

关于 server->client 数据发送,如果你喜欢远程调用机制,看看这个: 
http://zhujiang73.cublog.cn

[ 本帖最后由 zhujiang73 于 2007-5-18 15:28 编辑 ]


 ruchong 回复于:2007-05-18 16:16:06

新整的blog把代码放到上面了啊
http://blog.chinaunix.net/u1/39117/showart.php?id=304140

大家多多光顾....


 redor 回复于:2007-05-18 18:49:34

我有一个比较完整的封装,呵呵,C实现的.
http://code.google.com/p/libsbase/downloads/list


 redor 回复于:2007-05-18 18:52:21

引用:原帖由 zhujiang73 于 2007-5-18 15:00 发表


支持原创,希望有比较详细的应用例子程序。

关于 server->client 数据发送,如果你喜欢远程调用机制,看看这个: 
http://zhujiang73.cublog.cn 



http://code.google.com/p/libsbase/downloads/list


lhttpd基于libsbase实现。


 zhujiang73 回复于:2007-05-21 14:14:37

引用:原帖由 redor 于 2007-5-18 18:52 发表


http://code.google.com/p/libsbase/downloads/list


lhttpd基于libsbase实现。 




老兄的文档写的不全呀 :)


 redor 回复于:2007-05-25 17:00:07

引用:原帖由 zhujiang73 于 2007-5-21 14:14 发表



老兄的文档写的不全呀 :) 



Just a idea ! 我非科班出身,没有写文档的习惯,呵呵,按照感觉做,我们公司现在用的都是我写的这个通信封装。。。。hehe


 zhongfangqing 回复于:2007-05-25 17:44:16

你好,请问,如果client端的socket突然关闭了,那么server端这边的epoll能不能收到一个EPOLL_IN或者EPOLL_ERR的消息,
如果能收到,怎么处理才能收到;如果收不到,那么怎样处理才能让server知道client的关闭并且作出响应,是不是要另外client向server发送心跳包来实现?
谢谢!!!


 chunyv 回复于:2007-06-04 17:03:54

我将testPool.cpp:30的sleep(-1);改成了sleep(1);

引用:

[root@dts threadpool]# make
g++  Log.cpp Thread.cpp Worker.cpp testPool.cpp ThreadPool.cpp Lock.cpp ListenThread.cpp Socket.cpp TaskThread.cpp -lpthread -g -o server
[root@dts threadpool]# valgrind ./server 
==29429== Memcheck, a memory error detector.
==29429== Copyright (C) 2002-2005, and GNU GPL'd, by Julian Seward et al.
==29429== Using LibVEX rev 1575, a library for dynamic binary translation.
==29429== Copyright (C) 2004-2005, and GNU GPL'd, by OpenWorks LLP.
==29429== Using valgrind-3.1.1, a dynamic binary instrumentation framework.
==29429== Copyright (C) 2000-2005, and GNU GPL'd, by Julian Seward et al.
==29429== For more details, rerun with: -v
==29429== 
Bind port 9999 is Successful
Listen thread is starting ....
==29429== 
==29429== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 5 from 1)
==29429== malloc/free: in use at exit: 9,464 bytes in 18 blocks.
==29429== malloc/free: [color=Red]18[/color] allocs, [color=Red]0 [/color]frees, 9,464 bytes allocated.
==29429== For counts of detected errors, rerun with: -v
==29429== searching for pointers to [color=Red] 18 [/color]not-freed blocks.
==29429== checked 21,125,256 bytes.
==29429== 
==29429== LEAK SUMMARY:
==29429==    definitely lost: 0 bytes in 0 blocks.
==29429==      possibly lost: 1,440 bytes in 5 blocks.
==29429==    still reachable: 8,024 bytes in 13 blocks.
==29429==         suppressed: 0 bytes in 0 blocks.
==29429== Reachable blocks (those to which a pointer was found) are not shown.
==29429== To see them, rerun with: --show-reachable=yes
[root@dts threadpool]# uname -a
Linux dts 2.6.9-42.ELsmp #1 SMP Tue Aug 15 10:35:26 BST 2006 x86_64 x86_64 x86_64 GNU/Linux






[ 本帖最后由 chunyv 于 2007-6-4 17:09 编辑 ]


 SupervisedBoy 回复于:2007-06-06 22:59:23

引用:原帖由 ruchong 于 2007-5-17 22:14 发表
连接ListenThread.cpp类发送信号通知ThreadPool.cpp类,收到信号再分配给TaskThread.cpp类,进行处理。如果没有空闲任务类,动态再创建一定数目的任务类。



个人觉得这种分发任务最好不要用信号实现,信号万一丢失了怎么办,那客户的请求就一直得不到处理,这是实际应用中不可接受的.建议采用消息通信实现,实现难度也不大,比起信号会好不少.


 wisage 回复于:2007-06-12 14:18:27

ddddddddddddddddddddd


 ruchong 回复于:2007-06-12 14:50:52

引用:原帖由 SupervisedBoy 于 2007-6-6 22:59 发表


个人觉得这种分发任务最好不要用信号实现,信号万一丢失了怎么办,那客户的请求就一直得不到处理,这是实际应用中不可接受的.建议采用消息通信实现,实现难度也不大,比起信号会好不少. 




多谢你的建议 , 回去测试一下...


 kf701 回复于:2007-06-12 17:56:57

用了  epoll 就 listen 一个 listenfd,  完全没有意义的工作。

你把accept得到的每个新的 fd 都送到 线程池队列里了,
就这么一个简单的工作,却写了这么一大堆代码,汗!


 ruchong 回复于:2007-06-12 18:08:31

引用:原帖由 kf701 于 2007-6-12 17:56 发表
用了  epoll 就 listen 一个 listenfd,  完全没有意义的工作。

你把accept得到的每个新的 fd 都送到 线程池队列里了,
就这么一个简单的工作,却写了这么一大堆代码,汗! 





说说你的想法.....
也把代码给大家看看.......


 hwz_119 回复于:2007-06-15 11:49:58

我是新手,这两天看了看楼主的代码,觉的有一处有些不妥: 楼主在忙闲队列间的动态调整采取的策略是:如果闲队列没有可用的工作线程,就生成n 个新线程后,再把所有忙队列中的工作线程加到闲队列中.假如客户端是长连接的话,你的后一步操作意义不大.而楼主之所以采取这个策略的根本原因是因为楼主用了deque来封装queue类.这样的话就不能有选择的将某个工作线程从忙队列加到闲队列了.


 antonym55 回复于:2007-06-25 03:24:51

从windows 转到Linux的, 还不会 epoll 

问个设计方面的问题,
看了一下代码中的头文件,几个线程类之间的关系如下:
[attach]199971[/attach] 

1. 为什么发送线程没有与线程池关联? 线程池类又继承了线程类,感觉这种设计有点乱.

2. 从一般角度来看,线程池和线程有一种包含的关系,为什么不是下面这种形式?

[attach]199972[/attach] 

或者 将线程类Thread, 做成抽象类,ThreadPool 再与之关联/依赖? (偷下懒,没画图)

[ 本帖最后由 antonym55 于 2007-6-25 10:26 编辑 ]



1









 ruchong 回复于:2007-06-25 10:13:46

引用:原帖由 antonym55 于 2007-6-25 03:24 发表
从windows 转到Linux的, 还不会 epoll 

问个设计方面的问题,
看了一下代码中的头文件,几个线程类之间的关系如下:


1. 为什 ... 




谢谢你的建议, 但是你画的图看不到。
方便的画能不能发到我的email里 [email]worm_gzm@yeah.net[/email]

谢谢........


 antonym55 回复于:2007-06-25 10:34:12

引用:原帖由 ruchong 于 2007-6-25 10:13 发表



谢谢你的建议, 但是你画的图看不到。
方便的画能不能发到我的email里 [email]worm_gzm@yeah.net[/email]

谢谢........ 




已经编辑了一下
原来的看不到,可能是被GFW了

[ 本帖最后由 antonym55 于 2007-6-25 11:45 编辑 ]


 antonym55 回复于:2007-06-30 19:00:47

特地到windows中生成了一个chm 文档, 发上来,供需要的人参考


全部下载后解压
引用:
cat x0[0-5] |tar zxvf -



x00

x01

x02

x03

x04

x05




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=937379
转载请注明作者名及原文出处



收藏本页到: