簡體   English   中英

我們需要鎖定此隊列嗎?

[英]do we need to lock this queue?

我認為,如果只有一個線程要添加到隊列中,而只有一個線程要從隊列中檢索,則不必為這些訪問操作鎖定隊列。

通常,檢索將處於循環中。 如果錯過一項,它將在下次嘗試中得到。 唯一需要關注的是獲取部分數據。 如果它是值類型隊列,並且該值大於一個基本存儲單元,則可能發生。 但是如果是引用類型,則應該可以。

我對嗎?

假設您正在談論Queue<T>

只要正在寫的線程和正在讀的線程是同一線程,就不需要鎖。 如果它們是不同的線程,則確實需要一個鎖。 該文檔明確指出,如果不同線程上的讀取器和寫入器需要鎖,

我相信隊列可以將信息保存在一個數組中; 如果隊列中的項目數超過了數組的大小,則該數組將替換為更大的數組。 隊列不包含任何機制來避免在發生此類重新分配時中斷正在進行的隊列操作。

當然,可以構造無鎖隊列實現,使其與並發讀取器和寫入器一起正常工作。 如果使用鏈表數據結構,還可以在不使用鎖的情況下支持多個並發編寫器(使用Interlocked.CompareExchange更新隊列)。 鏈表隊列需要為每個插入分配一個新對象,通常效率不如基於數組的隊列,但是多寫入者隊列可以派上用場。

暫無
暫無

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

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