2016-04-13 4 views
4

私はデータ収集システムを作成しています。システムは、当社の信号デジタイザからの高速データと、検出器の高電圧システムのようなものに対する遅い制御/監視の両方を処理しています。低速制御システムは、1秒に1回電圧を読み取り、それらをデータ構造に書き込む。1つのスレッドによって書き込まれ、多くの人が読む変数をガードする必要はありますか?

各イベントには、検出器の電圧がディスクに書き込まれる前にタグが付けられます。これを行うために、イベント処理スレッドは、遅い制御/監視スレッドによって書き込まれた構造を読み込みます。

電圧読み取りが1秒前の電圧でタグ付けされてからXマイクロ秒後に発生したイベントがあるかどうかは関係ありません:構造内のデータ構造または原子変数を保護するためには、 ?

+1

私が知る限り、問題はないはずです。 – pingul

+0

同じオブジェクトからの読み書きが可能ですか? – NathanOliver

答えて

6

正しく、すべての2番目のスレッドは、電圧を読み取って、それをいくつかの "データ構造"に書き込み、他のスレッドはそのデータ構造から毎時読み取っています(私は正しいですか?)

この "データ構造"他のスレッドが読んでいる値が決して変更されない可能性があります(または並べ替えのような他の厄介なことが起こる可能性があります)。アトミックストア/ロードがキャッシュ記憶域からではなくメモリ記憶域から正しく読み書きされるように同期が必要です。

この「データ構造」がアトミックでない場合は、未定義のビヘイビアを処理していますが、これは常に間違っています。

したがって、アトミックでもロックでも、「データ構造」をアトミックと同期の両方で作成する必要があります。

この「データ構造」が十分に小さい場合は、ここでstd::atomicが適しているようです。もしそうでなければ、あなたのシステムがリーダーライターのロックをサポートしているかどうかを見てください。

+0

"volatile"を指定すると、アトミックバール – Eugene

+1

のキャッシュは防止されますが、並べ替えは行われません。 –

+0

うん、彼はそれを気にしていないようだ。 – Eugene

2

はい、データ競合の可能性を排除するために、アトミックにする必要があります。極端なパフォーマンスが必要な場合は、変数を読み書きするときに緩やかなメモリ順序を使用することができます。これは原子性を保証しますが、順序を追加しません(Intelなどのアーキテクチャが自然に注文されない場合)

関連する問題