这只是一个线程池的框架还有许多不足 : 没有实现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 编辑 ]
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
|