2011-01-25 170 views
0

我想用C編寫一個高性能的同步生成器。我希望能夠向它提供事件並使多個線程能夠異步地輪詢/讀取,以便線程永遠不會收到重複項。C中的線程安全?

我並不十分了解通常如何進行同步。有人能給我一個我可能能夠使用的一種或多種技術的高級解釋嗎?

謝謝!

回答

1

線程安全的主要概念是Mutex(雖然有不同種類的鎖)。 它用於保護您的記憶免受多次訪問和競爭條件的影響。

使用Linked List就是一個很好的例子。您不能允許兩個不同的線程在同一時間修改它。在你的例子中,你可能使用一個鏈表來創建一個隊列,每個線程都會從中消耗一些數據。

顯然還有其他的同步機制,但是這個是(至今?)最重要的。

您可以查看this頁面(以及底部的參考頁面)以獲取更多實施細節。

2

您需要thread implementation; C沒有任何對多處理概念的內置支持。因此線程經常被實現爲庫。這樣的庫通常會爲您提供同步多線程執行的方法,保護數據的方法等。

+0

是否無法以獨立於實現的方式進行同步?我只問,因爲我對體系結構的其餘部分了解不多 - 我懷疑可能存在一種系統模式,在這種模式下,事件被拉到網絡上,所以同步可能發生在機器之間而不是線程之間一個單獨的父進程。這是否有重大的不同? – 2011-01-25 13:03:20

+0

你的兩個獨立的機器不共享內存,所以你應該在這裏確定。 – 2011-01-25 13:06:05

0

當線程間存在共享變量時,線程安全將成爲問題。如果你沒有任何共享變量,這不是問題。每個事件都可以只讀,並隨機向聽衆展示。

0

線程安全性是通過使用多線程實現提供的任何同步原語來實現的。

你的起始點可能是事件的鏈表,一個保護它的鎖,每個線程接受鎖,通過調整指向第一個事件的指針來消費一個事件,然後釋放鎖;追加事件也會鎖定整個列表。當清單清空時,工作人員退出。

從那裏,各種的優化是可能的:

  • 緩存指針到最後一個事件,所以附加的事件列表變得更便宜。
  • 添加通知機制,以便工作線程在列表爲空時可以休眠。通常,這是通過稱爲條件變量來實現的。
  • 使用多個列表,所以如果第一個列表被鎖定,worker可以從另一個列表中檢索一個事件,而不必等待當前已經鎖定列表的線程。