我正在使用Dictionary作爲後備存儲的線程安全集合。鎖定函數是否可用於實現線程安全枚舉?
在C#中,你可以做到以下幾點:
private IEnumerable<KeyValuePair<K, V>> Enumerate() {
if (_synchronize) {
lock (_locker) {
foreach (var entry in _dict)
yield return entry;
}
} else {
foreach (var entry in _dict)
yield return entry;
}
}
我發現這樣做在F#的唯一方法是使用監控,如:
let enumerate() =
if synchronize then
seq {
System.Threading.Monitor.Enter(locker)
try for entry in dict -> entry
finally System.Threading.Monitor.Exit(locker)
}
else seq { for entry in dict -> entry }
可以這樣用做鎖定功能?或者,有沒有更好的方法來做到這一點?我不認爲返回迭代集合的副本將工作,因爲我需要絕對同步。
我同意@kvb,原來的代碼/設計充其量是可疑的。 – Brian 2010-05-14 16:47:15