我有一个 .NET 3.5 应用程序,其中 Dictionary 实例在两个线程之间共享。我知道字典本身在任何方面都不是线程安全的,但我只有一个线程可以修改字典,而另一个线程只需要确保它在执行其工作时具有最新的值。(从最严格的意义上讲,即使是最新的也不是硬性要求)
一个线程正在接收间歇性串行数据并调用 Set 函数来更改字典中的值。(此字典在初始设置后是固定大小的,我基本上只是将其用作稀疏数组)
第二个线程收集当前存储在字典中的值,并通过 GetLatestValues() 对它们进行一些处理。
public class HwMemoryMap{
Dictionary<int, HwDataItem> HwCache;
public void Set(HwDataItem dataItem){
HwCache[dataItem.PtId] = dataItem;
MemoryBarrier();
}
public List<HwDataItem> GetLatestValues(){
System.Threading.Thread.MemoryBarrier();
List<HwDataItem> HwDataItemList = new List<HwDataItem>();
// do work here to pull appropriate values out of HwCache
HwDataItemList.Add(HwCache[0]); // etc
return HwDataItemList;
}
}
此处的 MemoryBarrier() 调用是否足以确保对特定键的字典值的更改在所有线程/内核中传播?
我的测试没有发现任何问题,但考虑到这些问题的性质,这并没有给我任何安慰。