簡體   English   中英

選擇Critical Sections,Mutex和Spin Locks

[英]Choosing between Critical Sections, Mutex and Spin Locks

選擇Critical Sections,Mutex和Spin Locks時要記住哪些因素? 所有這些都提供了同步,但有什么具體的指導方針何時使用什么?

編輯:我的意思是Windows平台,因為它有一個關鍵部分的概念作為同步結構。

在Windows用語中,關鍵部分是自旋鎖和非忙等待之間的混合。 它旋轉了一小段時間,然后 - 如果還沒有抓住資源 - 它會設置一個事件並等待它。 如果資源爭用率較低,則自旋鎖定行為通常就足夠了。

對於不需要擔心與其他進程共享資源的多線程程序,Critical Sections是一個不錯的選擇。

互斥鎖是一種很好的通用鎖。 命名互斥鎖可用於控制多個進程之間的訪問。 但是,使用互斥鎖通常比關鍵部分貴一點。

要考慮的一般要點:

  1. 使用該機制的性能成本。
  2. 使用該機制引入的復雜性。

在任何給定的情況下,1或2可能更重要。

例如

如果您使用多線程通過使用許多內核來編寫高性能算法並且需要保護一些數據以便安全訪問,那么1可能非常重要。

如果您有一個應用程序,其中使用后台線程輪詢定時器上的某些信息,並且在極少數情況下它會注意到更新,您需要保護一些數據以進行訪問,那么2可能比1更重要。

1將歸結為底層實現,並且可能與保護范圍一致,例如,進程內部的鎖通常比跨機器上所有進程的鎖更快。

2很容易誤判。 首次嘗試使用鎖來編寫線程安全代碼通常會遺漏一些導致死鎖的情況。 例如,如果線程A在線程B持有的鎖上等待但線程B在線程A持有的鎖上等待,則會發生簡單的死鎖。令人驚訝的是容易實現。

在任何給定的平台上,鎖定機構的命名和質量可能會有所不同。

在Windows上,關鍵部分是快速且特定於進程的,互斥體較慢但是跨進程。 信號量提供更復雜的用例。 一些問題,例如來自池的分配可以使用原子函數非常有效地解決,而不是例如在窗口InterlockedIncrement上非常快速地解鎖。

Windows中的Mutex實際上是一種進程間並發機制,當用於進程內線程時,它非常慢。 關鍵部分是Windows通常認為的互斥鎖的類似物。

當被爭議的資源通常不被保持很長時間時,最好使用自旋鎖,這意味着具有鎖定的線程很可能很快就會放棄。

編輯:只有你的意思是“在Windows上”,我的答案才有意義,所以希望這就是你的意思。

暫無
暫無

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

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