Chinaunix

标题: 同时支持 pthread 和 windows thread 的线程池 [打印本页]

作者: iunknown    时间: 2008-05-18 21:34
标题: 同时支持 pthread 和 windows thread 的线程池
把之前做的基于 pthread 的线程池代码,移植到了 windows 平台。
移植方法是在 windows 平台用 Mutex 和 Event 模拟了 pthread_mutex 和 pthread_cond 类型。
和平台相关的内容统一在一个 spthread.h 中。线程池的实现代码中,就不再需要 ifdef 这种东西了。

实现思路的说明:
Build a thread pool in C

下载
http://spserver.googlecode.com/files/threadpool-0.2.src.tar.gz

[ 本帖最后由 iunknown 于 2008-5-19 14:15 编辑 ]
作者: 醉卧水云间    时间: 2008-05-18 22:12
怎么那么多人喜欢线程池?
作者: qingfengjianke    时间: 2008-05-19 08:56
顶 ............支持
作者: LittlePython    时间: 2008-05-19 09:28
支持!
作者: xiaomiao    时间: 2008-05-19 10:02
提示: 作者被禁止或删除 内容自动屏蔽
作者: iunknown    时间: 2008-05-19 13:58
原帖由 醉卧水云间 于 2008-5-18 22:12 发表
怎么那么多人喜欢线程池?


在繁忙的服务器上,用和不用线程池,在性能上还是有一些区别的。
作者: iunknown    时间: 2008-05-19 13:59
原帖由 xiaomiao 于 2008-5-19 10:02 发表
sourceforge.net上不是有pthread_win32的项目吗?把pthread库移植到了Win32平台下,应该是可行的


一开始就是拿 pthread_win32 这个项目在 windows 下做测试的,后来觉得多了一个依赖,用起来不够方便,因此就尝试改成用 windows 本地的 Thread API 。
作者: 醉卧水云间    时间: 2008-05-19 14:04
原帖由 iunknown 于 2008-5-19 13:58 发表


在繁忙的服务器上,用和不用线程池,在性能上还是有一些区别的。


那倒是, 在这个版里总看了不下10个线程池了, 轮子太多了, 都不知道用哪个了.
作者: iunknown    时间: 2008-05-19 14:12
原帖由 醉卧水云间 于 2008-5-19 14:04 发表


那倒是, 在这个版里总看了不下10个线程池了, 轮子太多了, 都不知道用哪个了.


的确是,在网上找 threadpool 可以找到一大堆。尤其多 c++ 写的,不过通常显得有点复杂。
我现在实现的这个,应该算是相对简单的一个了,用 c 实现的,就三个接口


  1.     typedef void *threadpool;

  2.     typedef void (*dispatch_fn)(void *);

  3.     threadpool create_threadpool(int num_threads_in_pool);

  4.     void dispatch(threadpool from_me, dispatch_fn dispatch_to_here, void *arg);

  5.     void destroy_threadpool(threadpool destroyme);

复制代码


接口定义来源是某个大学的一个作业
http://paul.rutgers.edu/~csgates/CS416/proj2/index.html
作者: qingfengjianke    时间: 2008-05-19 14:28
   作业都是这, 那这个大学 可是 挺牛逼的,
作者: iunknown    时间: 2008-05-19 19:58
原帖由 qingfengjianke 于 2008-5-19 14:28 发表
   作业都是这, 那这个大学 可是 挺牛逼的,


真正按它的要求写一个完整的实现出来,对于理解线程的工作原理,还是很有作用的。
作者: marxn    时间: 2008-05-19 22:16
说几点:
1、win32提供的mutex属于递归锁,与pthread提供的mutex不同。但后者可以通过在建立时改变其属性来实现递归锁。跨平台的库应注意尽量保证功能上的一致性。
2、win32提供的event机制本身已经实现了线程的排队机制,不需要通过mutex来进行同步。
3、win32的event是通过kernel object实现的,可以保证每一个SetEvent都会被某个线程接收;pthread的条件变量机制只能实现通知,并不能保证一定有线程能够接收到。实现时要注意这些区别。
作者: im2web    时间: 2008-05-19 22:31
轮子造了无数, 我也造过了。

我的意见是不要用线程池,线程自己切换就可以了。
作者: iunknown    时间: 2008-05-20 09:51
原帖由 marxn 于 2008-5-19 22:16 发表
说几点:
1、win32提供的mutex属于递归锁,与pthread提供的mutex不同。但后者可以通过在建立时改变其属性来实现递归锁。跨平台的库应注意尽量保证功能上的一致性。
2、win32提供的event机制本身已经实现了线程的排队机制,不需要通过mutex来进行同步。
3、win32的event是通过kernel object实现的,可以保证每一个SetEvent都会被某个线程接收;pthread的条件变量机制只能实现通知,并不能保证一定有线程能够接收到。实现时要注意这些区别。


多谢指点。

这个库的目标是提供一个方便使用的跨平台的 线程池 的实现,而并不是提供一个完整的跨平台的 线程库。
在 Windows 平台,这个库模拟 pthread 实现的 线程 API 仅仅是在线程池的实现中要用到的那部分。

一般跨平台的移植,通常有 3 种做法
1.以 A 平台的接口为准,在 B 平台上模拟出 A 平台的接口
2.反过来,以 B 平台的接口为准,在 A 平台上模拟出 B 平台的接口
3.自定义一套接口,分别在 A 和 B 平台上实现

在这次的移植中,是以 pthread 的接口为准,用 Windows Thread 来模拟 pthread 的接口。
作者: iunknown    时间: 2008-05-20 09:55
原帖由 im2web 于 2008-5-19 22:31 发表
轮子造了无数, 我也造过了。

我的意见是不要用线程池,线程自己切换就可以了。


线程池里面的线程大多数时候也是自己切换的啊。

使用线程池的一个比较典型的例子是目前 mysql 的实现。mysql 目前是采取 one_thread_per_connection 的模型的。
如果不用线程池,那么每当有一个连接上来的时候,mysql 就创建一个线程,等这个连接被关掉的时候,线程就退出。
但目前 mysql 采用的方法是使用一个线程池。
作者: marxn    时间: 2008-05-20 14:36
标题: 回复 #14 iunknown 的帖子
呵呵,其实还有一种选择:既不实现A平台的全部接口,也不实现B平台的全部接口。而是取A平台和B平台的交集。尽量使用最少的平台接口可以提高程序的可移植性。
某些平台提供的一些接口在另一个平台实现起来比较困难,或者实现以后效率太低。因此可以不去实现,而用其他方法代替。例如,win32通过内核对象的机制提供mutex、semaphore、event等机制,因此这些机制可以用于跨进程的线程同步,但在posix平台上这一点就比较弱。还有pthread的rwlock机制,在win32下实现就比较困难。我查阅了网上的一些代码,都不能避免thread starvation的问题(或者哪位牛人使用win32实现了比较高效的rwlock,请赐教,呵呵)。
作者: fswenly    时间: 2011-04-24 02:14
这处得好好研究下了,好象不怎么会用。




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