Dictionary インスタンスが 2 つのスレッド間で共有される .NET 3.5 アプリケーションがあります。ディクショナリ自体はスレッドセーフではないことは理解していますが、ディクショナリを変更できるスレッドは 1 つしかなく、もう 1 つのスレッドは作業を実行するときに最新の値を保持する必要があるだけです。(厳密な意味では、最新であることは難しい要件ではありません)
1 つのスレッドが断続的なシリアル データを受信し、Set 関数を呼び出してディクショナリ内の値を変更しています。(このディクショナリは初期設定後は固定サイズで、基本的にはスパース配列として使用しています)
2 番目のスレッドは、現在ディクショナリに格納されている値を収集し、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() 呼び出しは、特定の Key のディクショナリ Value への変更がすべてのスレッド/コアに伝達されることを保証するのに十分ですか?
私のテストでは問題は明らかになりませんでしたが、これらの問題の性質を考えると、それは私に何の慰めにもなりません.