给定一个结构数组:
public struct Instrument
{
public double NoS;
public double Last;
}
var a1 = new Instrument[100];
以及一个线程任务池,它基于单个元素最多可以由两个线程同时写入,一个用于双字段中的每一个(有效地按主题进行上游排队)来写入这些元素。
并且可以在 64 位上原子地写入 double 的知识。(编辑这个误说原来是32位)
我需要使用数组中的所有值定期执行计算,并且我希望它们在计算期间保持一致。
所以我可以使用以下方法对数组进行快照:
var snapshot = a1.Clone();
现在我的问题是关于同步的细节。如果我让成员变得易变,我认为这根本不会帮助克隆,因为读/写获取/释放不在数组级别。
现在我可以有一个数组锁,但这会在最频繁的向数组中写入数据的过程中增加很多争用。所以不太理想。
或者我可以有一个每行锁,但这将是一个真正的痛苦,因为它们都需要在克隆之前被获取,同时我已经得到了所有的写入备份。
现在,如果快照没有最新的值,如果它只是微秒等问题,这并不重要,所以我想我可能只是没有锁就可以逃脱。我唯一担心的是,是否可能存在持续一段时间没有缓存写回的情况。这是我应该担心的事情吗?编写者在 TPL 数据流中,唯一的逻辑是在结构中设置两个字段。我真的不知道函数范围如何或是否倾向于与缓存回写相关。
想法/建议?
编辑:如果我对结构中的变量使用互锁写入怎么办?
edit2:写入量远高于读取量。还有两个单独和并发的服务写入 Nos 和 Last 字段。所以它们可以同时被写入。这会导致原子性参考对象方法出现问题。
编辑3:更多细节。假设数组包含 30-1000 个元素,并且每个元素可以每秒更新多次。