Chinaunix

标题: 请问哪位有线程池的实现例子? [打印本页]

作者: yuonunix    时间: 2003-08-04 08:58
标题: 请问哪位有线程池的实现例子?
在网上找到一个线程池的实现,http://lxr.webperf.org/source.cgi/server/mpm/experimental/threadpool/threadpool.c,
但是没有啥注释,还没有看懂,各位是否有更加好的实现?或者例子?谢了!
作者: yuonunix    时间: 2003-08-04 09:17
标题: 请问哪位有线程池的实现例子?
补充一下,我需要的是Solaris平台上C++的threadpool实现。不过,其他平台,如果有参考价值,容易移植,也欢迎提供哦。
作者: deathbravo    时间: 2003-08-04 09:28
标题: 请问哪位有线程池的实现例子?
请问一下;
为什么大家都热衷于实现线程池?

sun的文档里说每次都新建线程比维护线程池开销更小,
莫非是骗人的??
作者: yuonunix    时间: 2003-08-04 09:45
标题: 请问哪位有线程池的实现例子?
原帖由 "deathbravo" 发表:
请问一下;
为什么大家都热衷于实现线程池?

sun的文档里说每次都新建线程比维护线程池开销更小,
莫非是骗人的??
   

我至少可以在网上找到上十篇文章说:

对于每个线程运行时间短、线程频繁的服务器应用,用线程池比创建线程开销小,你说的“sun的文档里说每次都新建线程比维护线程池开销更小”是在什么地方,我去确认一下,麻烦给个链接!
作者: yuonunix    时间: 2003-08-04 09:52
标题: 请问哪位有线程池的实现例子?
发现一个好地方,这里的threadpool感觉提供的接口很好用,

http://www.numerik.uni-kiel.de/~rok/projects/threadpool/download.html,推荐给大家,

个人感觉比http://lxr.webperf.org/source.cgi/server/mpm/experimental/threadpool/threadpool.c提供的接口要简单易懂,各位有什么高见,没有更加好的东东,我就准备用前者了。
作者: deathbravo    时间: 2003-08-04 10:02
标题: 请问哪位有线程池的实现例子?
ftp://docs-pdf.sun.com/806-5257/806-5257.pdf
233页第5行,
我并不是说你骗人呀;
我就是想问一问是不是sun在骗人
作者: yuonunix    时间: 2003-08-04 11:12
标题: 请问哪位有线程池的实现例子?
刚才查阅了一下,确有其事, 究竟是哪种理论正确。不知是否有人做过实验?不知版主是否能给出个权威答案?

SUN文档的原文如下:
Creating and Using Threads
The threads packages will cache the threads data structure, stacks, and LWPs so that
the repetitive creation of unbound threads can be inexpensive.

Unbound thread creation has considerable overhead when compared to process
creation or even to bound thread creation. In fact, the overhead is similar to unbound
thread synchronization when you include the context switches to stop one thread
and start another.
So, creating and destroying threads as they are required is usually better than
attempting to manage a pool of threads that wait for independent work.
A good example of this is an RPC server that creates a thread for each request and
destroys it when the reply is delivered, instead of trying to maintain a pool of
threads to service requests.
While thread creation has less overhead compared to that of process creation, it is
not efficient when compared to the cost of a few instructions. Create threads for
processing that lasts at least a couple of thousand machine instructions.
作者: gadfly    时间: 2003-08-04 11:54
标题: 请问哪位有线程池的实现例子?
我说一下我的理解。

线程创建的代价很低,所以文档上说,即时创建线程的代价不见得比管理一个pool的代价高。相比之下,由于即时创建进程的代价太大,所以比进程池的模式性能要差很多。

我觉得不能孤立的来比较这两种机制。设计上,尽量将任务划分位独立的不同部分,分别由不同的线程(进程)来并发处理,尽量消除瓶颈,才是提高性能的关键。

单从并发处理任务的性能上来说,费时间的任务,性能不会相差很多。至于小的任务,并发请求超多的情况下,如果pool的管理效率高的话,应该是pool的性能好些,但是并发请求并不太高的情况下,也不会明显。
作者: yuonunix    时间: 2003-08-04 12:04
标题: 请问哪位有线程池的实现例子?
原帖由 "gadfly" 发表:
我说一下我的理解。

线程创建的代价很低,所以文档上说,即时创建线程的代价不见得比管理一个pool的代价高。相比之下,由于即时创建进程的代价太大,所以比进程池的模式性能要差很多。

我觉得不能孤立的来比较..........
   

我觉得你的理论有道理,但是你的翻译不准确,
creating and destroying threads as they are required is usually better than
attempting to manage a pool of threads that wait for independent work.

这句话的意思是:
“创建和销毁进程的代价通常比线程池管理要代价小,因为线程池管理需要额外的工作。”,

并不是您的意思:
“即时创建线程的代价不见得比管理一个pool的代价高”,我觉得,这些英文的意思和你的观点是相对的。
作者: gadfly    时间: 2003-08-04 12:37
标题: 请问哪位有线程池的实现例子?
呵呵。
这个需要测试才知道。没对比过,所以我不能绝对的下结论,加入了我的一些理解。
作者: yuonunix    时间: 2003-08-04 13:12
标题: 请问哪位有线程池的实现例子?
我觉得这个问题不至于没有标准答案吧,并且是每个开发人员都可能碰到的问题,不知版主能否搞个权威的结论?谢了!(实际上,很久以前,我也听说过:用进程池比不用进程池效率低的说法,但我觉得这种理论证据不足,未加理会)
作者: yuonunix    时间: 2003-08-05 10:07
标题: 请问哪位有线程池的实现例子?
我的测试结果新鲜出炉:在我的机器上,在我的环境下,用线程池速度比较快。我倾向于用线程池,也只能云者见云,智者见智了。
作者: deathbravo    时间: 2003-08-05 11:26
标题: 请问哪位有线程池的实现例子?
说说看性能提高多少?
作者: yuonunix    时间: 2003-08-05 11:40
标题: 请问哪位有线程池的实现例子?
快40%
作者: gadfly    时间: 2003-08-05 13:03
标题: 请问哪位有线程池的实现例子?
能说明一下机器的大概环境和测试的任务么?
作者: deathbravo    时间: 2003-08-05 14:19
标题: 请问哪位有线程池的实现例子?
对呀对呀;
大家都作做实验;
把结果和环境都公开;
然后统计一下;
对大家都有好处;
等我闲一点就做
作者: yuonunix    时间: 2003-08-05 15:13
标题: 请问哪位有线程池的实现例子?
以我的最新的测试数据为例:
  每个线程跑的内容如下:   
   real * _matrix = new real[ 100 * 100 ];
        
        for ( uint i = 0; i < 100; i++ )
        {
            for ( uint j = 0; j < 100; j++ )
            {
                _matrix[ (i*100) + j ] = std::sin( real(j) * M_PI * std::cos( real(i) ));
            }// for
        }// for

        delete _matrix;

测试环境:
Solaris 8

时间:
线程池:45001ms
非线程池:52215ms


注:更换每个线程跑的内容,测试结果有差别,希望大家提供自己的数据。
作者: yuonunix    时间: 2003-08-05 15:51
标题: 请问哪位有线程池的实现例子?
改为

real * _matrix = new real[ 10 * 10 ];

for ( uint i = 0; i < 10; i++ )
{
for ( uint j = 0; j < 10; j++ )
{
_matrix[ (i*10) + j ] = std::sin( real(j) * M_PI * std::cos( real(i) ));
}// for
}// for

delete _matrix;

时间就快40%,可见进程创建的时间真的是不可小觑。
作者: gadfly    时间: 2003-08-05 23:02
标题: 请问哪位有线程池的实现例子?
呵呵,你下面这个任务的执行时间太短了。

实际中恐怕不会有这么简单和短小的任务。如果真是这么频繁且小的过程,确实应该用线程池了。

加精华了,希望更多的人关注。
作者: yuonunix    时间: 2003-08-06 08:48
标题: 请问哪位有线程池的实现例子?
我觉得在现实中,这样小的东东还是很多的,

real * _matrix = new real[ 10 * 10 ];

for ( uint i = 0; i < 10; i++ )
{
for ( uint j = 0; j < 10; j++ )
{
_matrix[ (i*10) + j ] = std::sin( real(j) * M_PI * std::cos( real(i) ));
}// for
}// for

delete _matrix;

相当于100个语句,并且每个语句还很复杂的,要算出std::sin( real(j) * M_PI * std::cos( real(i) ))的值嘛,也就是说,如果和没有循环的函数相比,这个函数所需要的时间应该也不短了,但是相对于存在循环的函数而言,这个函数所需要的时间的确很短,而我们实际编程过程中,没有循环的函数(线程)也是很多的。
作者: deathbravo    时间: 2003-08-06 09:59
标题: 请问哪位有线程池的实现例子?
在实际应用里大概都要涉及I/O
网络操作或者数据库操作吧
作者: deathbravo    时间: 2003-08-06 10:00
标题: 请问哪位有线程池的实现例子?
在实际应用里大概都要涉及I/O
网络操作或者数据库操作吧
作者: yianhuang_cs    时间: 2003-08-06 18:15
标题: 请问哪位有线程池的实现例子?
一个菜鸟问题:
    如果我创建了一个1000个线程的线程池,对每个请求有一个线程去处理,但是如果这个线程结束了,我怎么知道该线程结束了,并且在生成一个线程到线程池中,还是原来的1000个线程???同理:进程池也是这样!有没有高手告诉我,谢谢大家!!!!!
作者: chenhao_no1    时间: 2003-10-31 22:00
标题: 请问哪位有线程池的实现例子?
具体的实现方法可以采用Follower/Leader模式.
please refer to http://www.cs.wustl.edu/~schmidt/PDF/lf.pdf
作者: wabc    时间: 2003-10-31 22:57
标题: 请问哪位有线程池的实现例子?
在Solaris上,LWP的创建要比内核线程的创建消耗的时间相差几十倍。
不同的系统,情况会不一样,即使对于“短连接”的应用,线程池也不一定是最佳的选择。

要说例子,那肯定是Apache了,他在使用进程池的基础上,在每个进程中又使用了线程池。
作者: chenhao_no1    时间: 2003-11-01 11:55
标题: 请问哪位有线程池的实现例子?
线程池效率的好坏与它的
1. 应用环景 2.操作系统线程实现模型 3.线程调度策略 4.任务负载
有关.

还有尽量减少线程的切换与同步.

请参考Leader/Follower模式
作者: wabc    时间: 2003-11-01 17:06
标题: 请问哪位有线程池的实现例子?
楼上的是怎么找到那片论文的?
作者: awhite    时间: 2006-06-09 16:14
标题: 提供的url不能访问
http://lxr.webperf.org/source.cg ... adpool/threadpool.c
http://www.numerik.uni-kiel.de/~ ... dpool/download.html
都不能访问,烦请给个有效的url.thanks
如果方便,发到a_white@163.net 谢谢




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2