読み込みノート「C ++プログラミングの同時本当の」(5) - アトミックメモリモデルと操作のタイプ

メモリモデル:
    C ++メモリ位置のレイアウト、クラス/の構造体struct /クラスのメンバを参照メモリ内のグローバル静的変数レイアウトを。
    複数のスレッドは、位置の値を変更し、または特定の順序を読み取るように変更する必要があり、そうでなければデータ競合または未定義の動作が発生する可能性があります。

アトミック:
    トランザクションと同様に、オブジェクトの値が原子であるか、読み取り、変更には、いくつかのケースにエラー値を読み取ったり変更しません。
    標準原子アトミック::タイプSTD <> ユーザをサポートするために加えてテンプレートタイプ、例えば等atomic_size_t atomic_bool、atomic_intなど組み込み型の複数種類の特別バージョンは、
    操作部インターフェースは、原子タイプを提供し、変異体原子の種類を-defined様々なオプションのパラメータシーケンスメモリ、デフォルトmemory_order_seq_cst; 
    
    STD ::原子の基本的なタイプatomic_flagは、唯一のブール・フラグを表し、2つの状態がある:test_and_set、曇りを設定するステップと、ATOMIC_FLAG_INITはさらに初期化初期化する必要が
    原子インスタンスを入力します。スピンロックを達成することができるが、これらに限定ための、この一般的なタイプを使用しないが、原子:: STDの使用は < BOOL > (STD :: atomic_bool)を入力します。
    
    ::アトミックSTD < BOOL >:ストアが暗黙の型BOOL付加compare_exchange_strongへの書き込み動作、リードモディファイライト動作交換、クエリ(負荷)またはロード操作を提供
    compare_exchange_weak比較決意スワップ機能。
    アトミック:: STD <T *> ::アトミック提供し、STD < BOOL >同様の外部インタフェースもfetch_add、fetch_subをサポートし、++ / - 操作。
    
    そのような組み込み原子atomic_intなどの他のタイプは、そのようなfetch_add、fetch_sub、fetch_and、fetch_xor化合物割り当て、等のような付加的なユーザインタフェース、フロントがあってもよい /後置増加/ 等を減少させます。
    
    原子タイプのユーザー定義型:ビット単位の割り当てが満たされなければ、ビット比較の特性に応じて、すなわち、カスタム・タイプは自明でなければならず、いかなる仮想関数メンバまたは仮想関数が存在しません。
    (STD ::アトミック < フロート / ダブル >推奨されません、同様のアトミック::のstd <はstd ::ベクトル< int型 >> また、使用することはできません)。
    
    アトミック操作の他のフリー機能:フォーム:STD、atomic_compare_exchange_weak :: atomic_load STD、STDのatomic_is_lock_free ::、:: 
    STD :: atomic_flag_clear_explicitのような。
    
    データ競合を避けるため、だけでなく、スレッド間の一連の操作を強制的にアトミック操作だけではありません。
    
アトミックメモリ配列(STD :: memory_order):
    コンパイラの最適化、CPUの命令パイプラインは、効率最適化するために、順序外の命令を生成することができる、
    C三つのモデルで利用可能++:取得する順次一致順- レリーズシーケンス、緩い順序を;、メモリ順の6種類の性能は、順序が異なるメモリのような異なるCPUアーキテクチャ上の異なるコストとすることができる有する
    memory_order_relaxed、memory_order_consume、memory_order_acquire、memory_order_release、memory_order_acq_rel、memory_order_seq_cs。
    
    シーケンス一貫順:
        デフォルトの順序のmemory_order_seq_cs、シングルスレッドの実行順序の順序と一致し、最も視覚的に並べ替え、行動、動作の前に別のスレッドが、スレッドとして
        順位が他のスレッドに表示され、必要でなければなりません一部のマルチプロセッサ・システム内のスレッド間でグローバル同期は、集中的な必要とし、時間のかかるプロセッサ間の通信は、特定の同期コストがあります。
    
    memory_order_relaxed:
        シングルスレッド又はに従ってアトミック操作起こる - 関係の前に、異なる実行スレッドの関係は任意です。これは、同じスレッドが一度、個々の原子にアクセスするために再配置することができない必要が
        与えられたスレッドは、変数の初期値を取得することはできません、このスレッドを読んだ後、カスタムを見て庭を取り扱っています。追加の同期は、各修飾の順序は、変数を使用するのではない場合には
        memory_order_relaxed。
    
    メモリバリア:STD :: atomic_thread_fence、グローバルな操作として、ハードウェアを制限したり、並べ替え、コンパイラによってために、バリア内のスレッドの実行のために他の原子の動作に影響を与えることができます。

 

おすすめ

転載: www.cnblogs.com/haomiao/p/11647403.html