2012-01-31 49 views
0

有人可以告訴我如何創建一個非阻塞計時器來刪除結構的數據? 我有這樣的結構:創建一個非阻塞計時器來擦除數據

struct info{ 
     char buf; 
     int expire; 
     }; 

現在,在到期的值的末尾,我需要刪除的數據到我的結構。事實是,在同一時間,我的程序正在做別的事情。那麼我該如何創建這個?甚至避免使用信號。

回答

1

它不起作用。刪除結構所需的時間很可能比安排稍後刪除結構所需的時間要少得多。原因在於,爲了稍後刪除結構,必須創建一些結構,以在稍後刪除它時稍後保存需要的信息到找到結構。然後,這個結構本身最終需要被釋放。對於這麼小的任務,這不值得調度的開銷。

在一個差異情況下,刪除非常複雜,這可能是值得的。例如,如果結構包含的列表或映射包含許多必須遍歷以銷燬每個元素的子元素,則可能需要調度一個線程來執行刪除操作。

具體細節取決於您使用的平臺和線程標準。但基本思想是,你有一個函數可以讓一個線程負責運行一段特定的代碼。

更新:嗯,等一下,定時器?如果代碼不能訪問它,爲什麼不現在刪除它?如果代碼要訪問它,爲什麼現在要設置計時器?你的問題有些蹊蹺。甚至沒有想到要安排刪除任何東西,直到所有事情都完成了100%。

+0

的情況是特別的。我有一個客戶,要求我的程序獲取文件。現在,我的程序通過服務器獲取文件。每個文件都有一些信息,例如expire字段。然後,我的程序獲取文件並將其發送給客戶端。同時,我的程序將它保存到一種緩存中。但在過期值結束時,我需要從緩存中清除該文件。那麼,我該如何執行它?這就是爲什麼我需要一個計時器,而我的程序處理來自客戶端的每個請求。我在linux下使用gcc – rschirin 2012-01-31 03:51:03

+0

將到期時間存儲在緩存中。然後,當您碰巧注意到緩存中過期的項目時,請將其刪除。如有必要,每隔一段時間,調用一次緩存過期函數。 (你可以在你的主循環中檢查自你上次過期以來的時間,如果超過10秒,則過期。) – 2012-01-31 05:06:23

+0

你寫道:「當你碰巧注意到緩存中過期的項目。 ..「如果我的程序正在做別的事情,例如正在處理來自客戶端的請求,並且緩存中的一個文件已過期,我該如何得到它的建議?例如:文件A進入緩存。 A的到期時間= 20秒。 客戶端請求文件B.處理此請求需要30秒。所以10秒前,我應該刪除文件A. 什麼時候? - 文件B請求結束時? - 在文件A到期的準確時刻? – rschirin 2012-01-31 13:44:15

1

如果你不想使用信號,你將需要某種類型的線程。任何更具體的答案將取決於您使用的操作系統和工具鏈。

+0

我使用linux和gcc – rschirin 2012-01-31 03:52:14

0

我認爲的座右銘是有一個計時器,如果它到期的客戶端服務器邏輯的情況下。您需要刪除時間到期的條目。當計時器到期時,您需要刪除該數據。 如果是的話:那麼它可以通過幾種方式來實現。 a)單線程:根據(時間間隔 - 現在)邏輯的差異創建一個排序隊列。所以最短跨度應該首先接收回調。您可以使用C++中的map實現定時器隊列。現在,當您的工作結束時,只需調用定時器函數來檢查隊列中是否存在任何已過期的請求。如果是,那麼它會刪除該數據。所以原型可能看起來像set_timer(void(pf)(void)); add_timer(void * context,long time_to_expire);添加計時器。

b)多線程:add_timer邏輯將相同。它將訪問全局地圖並在鎖定後添加它。此線程將在地圖中最短時間(使用條件變量)休眠。同時,如果有任何計時器隊列的添加,它將從添加數據的線程獲得通知。爲什麼它需要睡在條件變量上,因爲它可能會得到一個間隔比現有最小值小的定時器。 因此,假設第一次通話從現在開始爲5秒,第二次計時器從現在開始3秒。 因此,如果計時器線程只休眠而不是條件變量,那麼它將在5秒後喚醒,而預計在3秒後喚醒。

希望這能夠澄清你的問題。 歡呼聲,