簡體   English   中英

多線程一讀一寫time_t

[英]multithreaded one read one write time_t

我正在編寫一個具有2個線程的多線程應用程序。 其中一個線程從隊列中接收數據並將其聚合,另一個線程將聚合后的數據發送到服務器。

我想知道上次收到數據的時間,所以我使用:

time_t last_data = time(NULL)

以獲得每個事件的正確時間(我不需要它是非常准確的,但我需要它是快速的),然后另一個將這個值與聚合數據一起發送。

我的問題是:

  1. 即使獲得最新更新對我來說不是很重要,我也必須同步嗎?
  2. 我用std::atomic<time_t>進行了測試,似乎有一些性能問題,還有其他更快的方法嗎?
  3. 如果我不同步讀/寫,會發生什么最壞的情況?
  4. 有沒有一種更快的方法來獲取當前時間,然后再獲取time(NULL) (不必非常准確)?

UPDATE

這是我的應用程序工作流程的說明。

應用程序需求:1.使用IPC(當前為nanomsg )從外部源消耗數據。 2.匯總數據。 3.每隔給定間隔(1秒)將聚合數據發送到遠程服務器。

當前實施:

  1. 創建2個緩沖區來保存聚合的數據(一個用於接收,一個用於發送)。
  2. 創建使用者線程以使用IPC中的數據並填充接收緩沖區。
  3. 創建一個發送線程,它將數據發送到服務器。
  4. 間隔的每次迭代,發送線程都會交換緩沖區(交換指針和使用互斥鎖進行鎖定),並將數據發送到服務器。

我不希望使用者等待網絡IO,所以我創建了此流程。 我可以在沒有所有鎖定的情況下在這里使用事件驅動來代替這種復雜的機制嗎(當前它運行良好,但我敢肯定它會更好)?

不要那樣做。 您只需要一個線程。 您可以使用選擇/輪詢/ epoll。 這些可以等待您的輸入,同時也可以完成輸出。 您將進行事件驅動的編程和非阻塞輸出。 這是值得學習的東西。 起初比較困難,但是很快會使生活更輕松,即不會遇到您現在遇到的問題。 而且程序會更快。

假設執行一個線程:

last_data = time(NULL);

而另一個使用last_data但兩者之間沒有同步事件,那么不能保證何時或是否將last_data的修改后的值對讀取線程可見。

但是,最嚴重的可能性是time_t寫入(可能是long )不是原子的,並且另一個線程可能讀取了損壞的“部分寫入”值。 這可能會導致延遲和時間計算故障,從而可能干擾下游流程。

您可能會分析您的程序,並發現由於兩者相互影響,因此在某個時刻有足夠的內存屏障可以保證最終更新。

注意:這是一種奇怪的情況,我懷疑您認為某些內容未同步,但實際上是同步的! 通常的體驗是相反的...

基本上沒有足夠的信息來了解您遇到的問題。 例如,如果讀者線程是唯一讀取時間的進程,那么我希望看到如下代碼:

線程1:如果接收到數據,則鎖定L,更新時間,添加到隊列,解鎖L。線程2:如果隊列L中的項目,讀取隊列和更新時間,解鎖L ..處理項目。

在這種情況下,時間將已經同步。

請提供一個最小,完整,可驗證的示例...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM