ブラインドは、アトミック変数間の関係を推測する、メモリバリア、メモリモデル、ロック

差1、atomic_flag及び原子<>の、atomic_flag関係なくコストは(CPUの数が多いかもしれない費用をロック)ロックすることが何であるか、atomic_flagは全くロックしないことが保証されません。場合によっては原子<>、ロックも選択する小さなものを要しないロック、ないかもしれないかもしれません。

図2に示すように、C ++メモリモデルは、同じメモリアドレスにアクセスするために複数のスレッドを指定する契約との間(プログラム最適化されたハードウェアおよびソフトウェアをスクランブルしてもよいコンパイラ、マルチコアCPU等を含む)、C ++プログラム、及びコンピュータシステムとして見ることができます意味論だけでなく、他のスレッドを見ることができるメモリアドレスのスレッドで更新。メモリ動作の合意された挙動セマンティクスに次の6つに定義されたC ++ 11原子ライブラリは、セマンティクスは異なる所定の再配置規則(すなわち、挿入ルールメモリバリア、ある同期点としてスレッド間の同期)。6つのオプションの合計が、彼らが表現するには、3つのメモリモデルです。

  • シーケンシャル一貫性のある(memory_order_seq_cst)、
  • リラックス(memory_order_seq_cst)。
  • 、(memory_order_consume、memory_order_acquire、memory_order_release、memory_order_acq_rel)放出を取得
列挙{typedefのmemory_order 
    /書き込み動作読みmemory_order_relaxed、//緩和
    memory_order_consumeを、//読み出し動作をするために消費
    memory_order_acquire、//読み出し動作のために取得する
    書き込み動作のためにmemory_order_release、//解放
    memory_order_acq_rel、//を取得する対応しますそしてリリース
    //順次読み出し動作/ライト動作のための一貫したmemory_order_seq_cst 
} memory_orderを。


同じスレッド内でのみ同一の原子へのアクセスを必要とmemory_order_relaxed変数を再配置することができない、メモリバリアは、最も緩いに挿入されていません。
memory_order_acquireとmemory_order_releaseがペアである、memory_order_acq_relは、アトミック変数がよく書かれた実行した後、原子変数が読み取られる前に、全ての読み出し動作、全てが書き込み操作を実行する権利、の両方を含みます
読み出し動作に関連したデータの依存関係を読み込む前にmemory_order_consume原子変数がうまく実行されます
memory_order_seq_cst最も厳しいです。厳密に順序に従って

  

MSCV简化了区别

memory_order_relaxed:
ボイドStore_relaxed_4(揮発性_Uint4_t * _Tgt、_Uint4_t _value)
{	 
        __iso_volatile_store32((揮発性INT *)_ TGT、_value)。
} 
memory_order_release:
ボイドStore_release_4(揮発性_Uint4_t * _Tgt、_Uint4_t _value)
{ 
        _Memory_barrier()。
        __iso_volatile_store32((揮発性のint *)_ TGT、_value); 
} 
memory_order_seq_cst:
ボイドStore_seq_cst_4(揮発性_Uint4_t * _Tgt、_Uint4_t _value)
{ 
        _Memory_barrier()。
        _iso_volatile_store32((揮発性のint *)_ TGT、_value); 
	_Memory_barrier()。
}           
memory_order_relaxed: 
_Uint4_t Load_relaxed_4(揮発性_Uint4_t * _Tgt)
{ 
    _Uint4_t _value。
    _value = __iso_volatile_load32((揮発性のint *)_ TGT)。
    リターン(_value); 
} 

memory_order_consume:
memory_order_acquire:
memory_order_seq_cst:
インライン_Uint4_t _Load_seq_cst_4(揮発性_Uint4_t * _Tgt)
{	 
    _Uint4_t _value。
    _value = __iso_volatile_load32((揮発性のint *)_ TGT)。
    _Memory_barrier()。
    リターン(_value); 
}

図3を参照すると、理解し、アトミック変数およびメモリバリア、アトミック変数およびメモリバリアによって実現ロックハードウェアサポートです。

4、関係なく、メモリ・モデルの、データを保護するために直接使用するロック場合がありますが、アトミック変数、より高い性能のロックフリーアルゴリズムの追求を使用している場合、あなたは良いメモリモデルを検討する必要があります。

メモリバリアによって具現5、メモリ・モデル

おすすめ

転載: www.cnblogs.com/l2017/p/11614545.html