UWP多執行緒列舉安全的List

2022-01-10 08:39:42 字數 930 閱讀 9948

在網上搜尋了一下,得出以下結論:

實現乙個真正執行緒安全的list是很困難的,具體可以參考這篇why are thread safe collections so hard?。

使用concurrentbag,微軟給出的執行緒安全的集合,缺點是unordered。如果集合依賴內部元素的順序,就不太合適了。

實現乙個列舉安全的list,所需的工作量相對小很多,甚至僅需要給已用到的list操作加上lock。

以下是乙個最小化實現的列舉安全的list。因為實際工程中,需要列舉安全的集合僅用到了add,count,索引等操作,所以繼承了ienumerable介面,而不是ilist。同時也不影響使用linq to objects的擴充套件方法,真是偷了乙個大懶。

class enumerationsafelist: ienumerable

ienumerator ienumerable.getenumerator()

public

void

add(t item)

}public

void

remove(t item)

}public

intcount}}

public t this[int

index]

}set }

}private listclone()

}return

clonelist;

}}

**對add,remove,count和索引四個操作加了lock,同時在列舉時通過加lock並返回當前集合的副本,來避免遍歷時因為其他執行緒的修改而丟擲異常。

如果**需要list型別的全部方法,就需要進一步修改,把ienumerable改成ilist並實現介面,就可以得到乙個完整的「data thread safe list」。

完整的**及測試用的程式:**

C 多執行緒之List的執行緒安全問題

網上關於list的執行緒安全問題將的很少,所以自己實驗了一把,發現確實是執行緒不安全的.所以當你在進行多執行緒程式設計中使用了共享的list集合,必須對其進行執行緒安全處理.list的add方法是執行緒不安全的,list的原始碼中的add方法,使用了每次當當前的元素達到上限,通過建立乙個新的陣列例項...

(多執行緒)多執行緒的併發安全

多執行緒併發操作同乙個資源 同步鎖 多執行緒操作的鎖必須唯一 必須搞清楚 哪些 需要同步?那些在操作共享資源的 只要包含非讀的操作,或者根據共享資源進行條件判斷的,就需要同步!同步 塊解決 package com.gc.thread 多執行緒操作共享資源 併發 執行緒安全問題 同步 鎖 相對而言效能...

多執行緒 執行緒安全

原因 當多個執行緒同時共享,同乙個全域性變數或靜態變數。做寫的操作時,可能發生資料衝突問題,也就是執行緒安全問題。但是做讀操作是不會發生資料衝突問題。解決方案 方式一 內建鎖synchronized synchronized保證執行緒原子性,當執行緒進入方法的時候,自動獲取鎖,一旦鎖被其它執行緒獲取...