2016-11-14 63 views
0

我通常使用串行隊列作爲鎖定機制,以確保一個資源可以被許多不同的線程訪問而不會出現問題。但是,我已經看到了其他開發人員使用併發隊列或甚至沒有信號的情況(在Linux上使用併發隊列和信號量看到了IBM/Swift)。Swift Queues/Concurrency and Locking

有沒有優點/缺點?我相信只要使用串行隊列就可以正確地阻塞資源而不浪費信號量。

另一方面,當CPU繁忙時會發生什麼?如果我沒有記錯,串行隊列不一定在同一個線程/同一個cpu上執行,對吧?

這將是我能想到的唯一解釋;併發隊列將能夠在所有可用的線程/ cpus上共享工作負載,確保通過信號量進行線程安全訪問。 使用沒有信號量的併發隊列將不安全,對吧?

回答

1

帶信號量的併發隊列爲您提供了更多的粒度,以確定需要鎖定的條件。您可以將大部分功能並行執行,只有互斥區域(關鍵區域)需要鎖定。

但是,這可以通過將關鍵區域分派到串行隊列的併發隊列來模擬,以確保相互排斥。

我相信只要使用串行隊列就可以在不浪費信號量的時間的情況下正確地阻塞資源。

串行隊列也需要信號量,因爲隊列的變異必須同步。但是,它將它放在地毯下,並且可以保護您免受與手動信號燈使用相關的許多易於犯錯的錯誤。

使用沒有信號量的併發隊列將不安全,對嗎?

都能跟得上

+0

非常感謝您的有識之士! :) – smat88dd