[問題] 關於 multithread timer 多執行緒的計時器

看板LinuxDev作者 (kir)時間11年前 (2013/08/14 14:04), 編輯推噓6(607)
留言13則, 3人參與, 最新討論串1/1
第一次在板上詢問...小的是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)

08/14 22:01, , 1F
不知使用 epoll 或 libevent 如何?
08/14 22:01, 1F
我原先是使用epoll下去實作,但發現一些問題才改變做法 後來另外一組人馬有用poll把他實做出來,我才發現原來poll有辦法做到

08/15 00:17, , 2F
timer_create - create a POSIX per-process timer
08/15 00:17, 2F
這個我沒嘗試過@@,會再去搜尋看看

08/15 21:38, , 3F
推 libevent
08/15 21:38, 3F

08/16 20:34, , 4F
忽然想到, 3 為何很吃資源? 是因為套用 2 在 main thread 嗎?
08/16 20:34, 4F

08/16 20:40, , 5F
然後, 2 是在 thread 用 non-blocking 嗎?
08/16 20:40, 5F
我是打算讓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)

08/30 21:27, , 6F
libev 和 libevent 是兩套不同的 library...
08/30 21:27, 6F

08/30 21:28, , 7F
使用 select/poll/epoll 基本原理都是 asynchronous 的方式,
08/30 21:28, 7F

08/30 21:29, , 8F
但在很多 FDs 和 Threads 的情況下, epoll 較佳...
08/30 21:29, 8F

08/30 21:33, , 9F
另外, 即使用 busy waiting 的方式, 還是可以適當加入一些
08/30 21:33, 9F

08/30 21:34, , 10F
條件做 usleep() 來避免狂吃資源...
08/30 21:34, 10F

08/30 21:36, , 11F
比方non-blocking read沒東西就慢慢加大usleep直到某上限之類.
08/30 21:36, 11F

08/30 21:37, , 12F
read 的到東西就不需做 usleep() ...
08/30 21:37, 12F

08/30 21:38, , 13F
另外, 不知您 "用「共用變數」的方式" 是怎樣的方式??
08/30 21:38, 13F
文章代碼(AID): #1I2ntrRq (LinuxDev)
文章代碼(AID): #1I2ntrRq (LinuxDev)