構造体の配列が与えられた場合:
public struct Instrument
{
public double NoS;
public double Last;
}
var a1 = new Instrument[100];
そして、単一の要素が最大で2つのスレッドによって同時に書き込まれる可能性があることに基づいてそれらの要素に書き込みを行うスレッドタスクプール(各ダブルフィールドに1つずつ)(トピックごとに効果的にアップストリームキューイングがあります)。
そして、doubleは64ビットでアトミックに記述できるという知識。(これを編集して、元々32ビットと誤って言った)
配列内のすべての値を使用して定期的に計算を実行する必要があり、計算中にそれらの値が一貫していることを望みます。
したがって、次の方法でアレイのスナップショットを作成できます。
var snapshot = a1.Clone();
今私が持っている質問は、同期の詳細に関するものです。メンバーを揮発性にした場合、読み取り/書き込みの取得/リリースはアレイレベルではないため、クローンの作成にはまったく役立たないと思います。
これで配列ロックを設定できましたが、これにより、配列にデータを書き込む最も頻繁なプロセスで多くの競合が発生します。だから理想的ではありません。
または、行ごとのロックを設定することもできますが、クローンを作成する前にすべてを取得する必要があるため、これは非常に面倒です。その間、書き込みはすべてバックアップされます。
スナップショットの値がマイクロ秒などの場合、最新の値でなくても問題はないので、ロックがなくても問題は解決できると思います。私の唯一の懸念は、持続的な期間のキャッシュの書き戻しがないシナリオが存在する可能性があるかどうかです。これは私が心配すべきことですか?ライターはTPLデータフローにあり、唯一のロジックは構造体に2つのフィールドを設定することです。ただし、関数スコープがキャッシュのライトバックと相関する傾向があるかどうかはわかりません。
考え/アドバイス?
編集:構造体の変数へのインターロック書き込みを使用した場合はどうなりますか?
edit2:書き込みの量は読み取りよりもはるかに多いです。Nos&Lastフィールドに書き込む2つの別個の同時サービスもあります。したがって、それらは同時に書き込まれる可能性があります。これにより、アトミック性の参照オブジェクトアプローチで問題が発生します。
edit3:詳細。配列が30〜1000の要素であり、各要素が1秒間に複数回更新される可能性があると想定します。