2010-03-09 109 views
9

我有一個項目列表,我需要在不同的時間間隔更新。該列表可以增長到數千個項目。每個項目可能有不同的時間間隔。如果我爲每個項目創建一個計時器,我是否會用線程飽和系統?我認爲最好創建一個等於項目集中最小間隔的計時器,然後在每次更新時增加一個計數器,然後檢查計數器現在是否等於任何其他間隔。如果最小間隔是所有其他間隔的倍數,這應該工作。有什麼建議麼?boost :: asio :: deadline_timer是否爲每個定時器使用一個線程?

回答

12

Boost不使用每個定時器的線程,它保留一個定時器隊列。每個計時器都是用實際工作的boost::asio::io_service對象創建的。

該對象可以在一個或多個線程when you run boost::asio::io_service::run() explicitly from multiple threads中調度其工作,但定時器和線程之間不存在一對一的對應關係,而且Asio不會在後面創建線程。

+0

好吧,但你說它會派遣其工作在「一個或多個」線程。默認情況下,如果我創建一個綁定到一個io_service的千位定時器,並且從一個線程調用io_service上的所有這些定時器,將會在一個新線程上執行?顯然,當你調用timer :: async_wait時,它們不會在調用線程上執行,對吧? 另外,儘管有這種能力,但是我所說的設計似乎更適合創建多個定時器嗎?或者我本質上是重複計時器呢? – Rhubarb 2010-03-09 02:00:25

+6

(1)是的,如果從線程A運行IO服務,則所有定時器處理程序都將在線程A上運行。(2)創建多個定時器是首選,因爲它比易於計算的最短維護更容易且更容易出錯間隔爲一個計時器(您將有1對1關係b/w工作項目和計時器)。 – 2010-03-09 02:06:18

+2

PS是的,你會複製Asio已經爲你做的工作(跟蹤最早的到期計時器)。 – 2010-03-09 02:14:58

1

Recent versions Asio,Boost 1.43和更高版本,在Linux上使用timerfd_create(2) API for deadline_timer s。

更改爲使用timerfd在Linux上調度定時器,當時 可用。

相關問題