2010-08-17 38 views
0

我打算使用timerfd_create以C語言編寫一個小型計時器庫。使用select實現計時器

這個庫的基本用戶將有兩個線程

  • 應用程序線程
  • 計時器線程

將會有這兩個線程之間的隊列,以便每當應用程序要啓動一個計時器,它會將消息推送到計時器線程將讀取的隊列中,併爲其創建一個FD並將其放入select

上述方法的問題在於,作爲單線程的計時器線程將在select系統調用中被阻止,並且不知道是否有消息已發佈到他的接收隊列中以啓動計時器。

解決此問題的一種方法是讓選擇超時每「滴答」一次,然後檢查隊列中的消息。他們是更好的方法來做到這一點? 我也想過在每次應用程序在select隊列中放置一條消息以中斷select時引發中斷。這對多線程應用程序有效嗎?

平臺:Unix

+0

你計劃如何計時器和應用程序線程交互? – 2010-08-18 09:22:04

+0

通過兩個線程之間的隊列 – 2010-08-18 13:12:59

+0

請參閱:https://stackoverflow.com/q/2328127/1153319 – 2017-11-04 05:12:42

回答

0

您想要定位哪個平臺?例如,在Windows下,沒有使用select()(如PostThreadMessage()和WaitMessage())可以處理這個問題。

+0

其Unix。我將這個問題加到 – 2010-08-18 04:34:47

+0

這顯然是Linux,因爲'timerfd_create(2)'是Linux專用的。 – 2010-08-18 23:47:31

0

如果您正在使用timerfd的那麼就沒有必要使用專用計時器線程,採用selectpoll,或epoll

+0

實際應用程序有3個線程,所有這些線程都可以隨時發出計時器請求。聽起來很有意思的是 – 2010-08-18 13:13:44

2

只寫圍繞一個事件循環的應用程序。如果你堅持有多個線程發佈定時器到一個專門的定時器線程坐在select(2),那麼爲什麼不使用eventfd(2)或只是一個老好的self-pipe trick表示新的定時器可用。將事件文件描述符包含到可輪詢集中,等待所有這些集合。

+0

。我會看一看。謝謝 – 2010-08-19 20:35:57