我正在使用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