デバイスレジスタの内容を複数のスレッドが読み取る変数にコピーしたいとします。これを行う一般的な方法がありますか?ここでこれを行う2つの方法の例です:あるスレッドのメモリストアを他のスレッドで「即座に」表示させるにはどうすればよいですか?
#include <atomic>
volatile int * const Device_reg_ptr = reinterpret_cast<int *>(0x666);
// This variable is read by multiple threads.
std::atomic<int> device_reg_copy;
// ...
// Method 1
const_cast<volatile std::atomic<int> &>(device_reg_copy)
.store(*Device_reg_ptr, std::memory_order_relaxed);
// Method 2
device_reg_copy.store(*Device_reg_ptr, std::memory_order_relaxed);
std::atomic_thread_fence(std::memory_order_release);
は、より一般的には、可能なプログラム全体の最適化に直面して、どのように1は、正しくメモリのレイテンシは他のスレッドに見えている1つのスレッドで書き込み制御していますか?
EDITは:組込みシステムに
- コードがCPU上で実行されている:あなたの答えでは、次のシナリオを検討してください。
- CPU上で1つのアプリケーションが実行されています。
- アプリケーションのスレッド数は、CPUのプロセッサコア数よりもはるかに少なくなっています。
- 各コアには大量のレジスタがあります。
- アプリケーションは、プログラムの最適化が実行可能ファイルを構築するときに十分に使用されるほど十分に小さいです。
あるスレッドのストアがほかのスレッドから無期限に見えないようにするにはどうすればよいですか?
'std :: atomic'を使用すると、可視性の問題(つまり、データ競合やダーティリードがない)がすでに解決されています。しかし、ロード/ストア操作のメモリの順序はまだ懸念されるかもしれませんが、適切な 'std :: memory_order'を' std :: atomic :: load' respに渡すことで簡単に制御できます。 'std :: atomic :: store'を参照してください。 「揮発性」または追加のメモリフェンスの必要はありません。 –
原子負荷を最適化して、公称負荷と実行時実行負荷命令の間に1-1の対応がないようにすることができます。揮発性はこの1-1の対応を保証する。 – WaltK
_ * _の前に_volatile_を置くと、ポインタはvolatileでなくレジスタになります。 @WaitK、右; – WaltK