作者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