C++11同時とマルチスレッドのまとめ(九)--原子操作atomicの概要


文書ディレクトリ


(一)スレッド概念、作成およびパラメータ伝達(二)排他的反発ロック–mutex,lock_guardyと他のmutex(3)unique_lock置換lock_guardy(四)単一例モード(Singleton)でのスレッドセキュリティ問題(五)window臨界領域(六)condition_variable条件変数(7)std::async非同期タスクとstd::future<>(8)packaged_task<>とpromise<>(九)原子操作atomic<>の概要
(1)概要
  • 複数のスレッドが1つの共有データを操作する場合、共有データは単純な操作にすぎず、ロックを用いて保護すると効率が非常に低下する
  • .
  • は、反発量を必要としないマルチスレッド同時保護
  • の原子操作を導入する.
  • は、通常のデータと同様に使用する、複数のスレッドが動作するプロセスは、その完全なデータ書き込みを中断することなく、すなわち、中間状態
  • は発生しない.
  • は単一の変数のみに対して、一般的にカウント統計
  • に用いられる.
    (2)使用方法
    1.テンプレートクラス、定義後変数の使用方法と一致する2.反発量ロックを用いるマルチスレッド同時モード3は不要である.データに対する操作過程は分割できず、データの安全を保証し、lockより効率が高い.一般に1つの変数のみに対して、同時の自己加算自己減算に用いられ、一般的にカウント統計に用いる.++–+=&=|=^=その他のデータにのみ適用すると、例えばa=a+1 6などのエラーが発生する可能性があります.コピー構造と付与値を直接使用することはできない.読み込みに使用できるload()は、以下のatomic atm 1=0である.atm1++; atomic atm2(atm1.load()); またはauto atm 2=atm 1.load(); 8.書くにはstore()atm 2を使用する.store(666);
  • はテンプレートクラス
  • に相当する.
    		std::atomic<int> atmnum(10);  // 10 int 
    
  • は、構造関数を直接使用して
  • を作成することはできません.
  • 特定のオペレータのみが使用できます.そうしないと、データと同じエラーが
  • 発生します.
  • テストコード
  • 	int commVar = 0;
    	std::mutex mtx;
    
    	// mutex 
    	void Write(){
    	        for (size_t i = 0; i < 1000000; i++) {
    	                mtx.lock(); 
    	                commVar++;
    	                mtx.unlock();
    	        }
    	        return;
    	}
    	
    	int main(int argc, char const *argv[]){
    	
    	        std::thread t1(Write);
    	        std::thread t2(Write);
    	
    	        t1.join();
    	        t2.join();
    	
    	        std::cout<<commVar<<std::endl;
    	        std::cout<<"main thread.
    "
    ; }