作者note35 (kir)
看板LinuxDev
标题[问题] 关於 multithread timer 多执行绪的计时器
时间Wed Aug 14 14:04:35 2013
第一次在板上询问...小的是linux系统程式的生手
最近在写proxy server碰到timer的问题:
我的需求是有一台proxy server (以下简称ps)
ps 会开 n 个 thread 去处理
"每个不同的client 对固定server 的连线(send跟recv)"
图解:
client --> proxy --> server
<-- <--
每个thread的特性就是,需要计时器去计时
每个client透过ps连到server有一段时间限制
(并不是处理完就关闭)
我目前有找到一些方法:
1. 针对单一thread: time.h里面有内建,使用的是定期传送signal(alarm)看是否过期
2. 狂耗CPU资源的方法: 就是随时都检查有没有过期
3. pthread_cond_init(): 这方法也是会面临main thread很吃资源的问题
4. glib提供的g_timeout_source_new(): 支援multithread,但程式码要砍掉重练
如果要尽量省CPU资源,多久检查检查的时间内都不会吃CPU
请问有更好的方法吗? 不然应该只能采用glib了
先谢谢板友
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.115.2.247
※ 编辑: note35 来自: 140.115.2.247 (08/14 14:10)
1F:推 yvb:不知使用 epoll 或 libevent 如何? 08/14 22:01
我原先是使用epoll下去实作,但发现一些问题才改变做法
後来另外一组人马有用poll把他实做出来,我才发现原来poll有办法做到
2F:推 tseng1129:timer_create - create a POSIX per-process timer 08/15 00:17
这个我没尝试过@@,会再去搜寻看看
3F:推 dou0228:推 libevent 08/15 21:38
4F:推 yvb:忽然想到, 3 为何很吃资源? 是因为套用 2 在 main thread 吗? 08/16 20:34
5F:→ yvb:然後, 2 是在 thread 用 non-blocking 吗? 08/16 20:40
我是打算让non-blocking跟blocking的方式都能运作
3的部分,诚如你所说,会在main thread上吃到CPU 100%
後来我的解决方法是用「共用变数」的方式去解决的
我拿成品交出去的时候,被对方认为这是种很奇妙的思维...
poll已经足够支援我的需求,这点也算长了一些知识
另外补充
libev其实就是涵盖了epoll(for linux)跟BSD自己的另一套poll函式库
使用libev也就能同时支援两个系统。
※ 编辑: note35 来自: 140.115.2.247 (08/22 19:02)
6F:推 yvb:libev 和 libevent 是两套不同的 library... 08/30 21:27
7F:→ yvb:使用 select/poll/epoll 基本原理都是 asynchronous 的方式, 08/30 21:28
8F:→ yvb:但在很多 FDs 和 Threads 的情况下, epoll 较佳... 08/30 21:29
9F:推 yvb:另外, 即使用 busy waiting 的方式, 还是可以适当加入一些 08/30 21:33
10F:→ yvb:条件做 usleep() 来避免狂吃资源... 08/30 21:34
11F:→ yvb:比方non-blocking read没东西就慢慢加大usleep直到某上限之类. 08/30 21:36
12F:→ yvb:read 的到东西就不需做 usleep() ... 08/30 21:37
13F:→ yvb:另外, 不知您 "用「共用变数」的方式" 是怎样的方式?? 08/30 21:38