<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      C++原子操作與內存序 1

      問題

      #include<iostream>
      #include<thread>
      int main()
      {
      	int sum = 0;
      	auto f = [&sum]() {
      		for (int i = 0; i < 10000; i++)
      			sum += 1;
      	};
      	std::thread t1(f);
      	std::thread t2(f);
      
      	t1.join();
      	t2.join();
      	std::cout << "the sum of 2 threads is: " << sum << std::endl;
      	std::cin.get();
      	return 0;
      }
      
      
      這個程序只是簡單的通過兩個線程對同一個變量進行累加10000次,正常不管線程執行的先后順序,結果都應該是20000才對,可實際輸出結果如圖所示,程序的輸出3次的結果都不一樣,不一定是預期的20000;

      運行結果

      分析

      對于+1操作,具體執行可以分為3個操作,如下圖所示:
      累加順序

      可以看出問題發生在兩個線程寫的時候,如線程1剛寫完,線程2繼續寫,則丟失一次加法。所以得出的值往往小于20000。

      解決

      可以通過std::mutex加鎖對變量操作進行保護,有沒有不用鎖也能實現的呢?C++中提供了原子操作可以實現這一目標。

      代碼如下:

      	std::atomic<int> sum1 = 0;
      	auto f1 = [&sum1]() {
      		for (int i = 0; i < 10000; i++)
      			sum1+=1;
      	};
      
      	std::thread t3(f1);
      	std::thread t4(f1);
      
      	t3.join();
      	t4.join();
      	std::cout << "the sum of 2 threads with atomic is: " << sum1 << std::endl;
      
      輸出如下:

      原子變量
      可以看出未原子化的sum仍然是每次結果不盡相同,而原子化的sum1每次結果都為20000。
      所謂原子操作指的是不可分割的操作,可以理解為只能編譯成一條單獨的CPU執行指令,不可以再分解,C++中,基本通過原子類型來實現原子操作。這種原子類型為std::atomic<T>,其中模板參數T為基本的數據類型,如bool,char,int,指針等。
      程序中將sum1原子化,并調用+=操作符(已重載為原子操作),之前分解的3步成了不可分割的1步,所以不會出現兩個線程同時已經進入寫的狀態,進而能保證累加結果的正確。

      注意事項

      1. 若累加操作改為sum1=sum1+1,就不是原子操作了,結果與sum沒有差別

      2. int型++/+=是原子操作fetch_add()的重載,類似的還有fetch_sub()/fetch_and/fetch_or()/fetch_xor()

      posted @ 2024-03-31 14:00  robot2017  閱讀(141)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲精品成人片在线观看精品字幕| 国产精品不卡一区二区视频 | 国产丰满麻豆videossexhd| 日韩av在线不卡一区二区| 极品白嫩少妇无套内谢| 精品国产成人国产在线观看| 真实国产老熟女无套中出| 九九九精品成人免费视频小说| 日日碰狠狠添天天爽不卡| 日韩一区二区在线观看视频| 久久精品国产88精品久久| 亚洲午夜爱爱香蕉片| 国产精品日日摸夜夜添夜夜添2021 | 久热久热中文字幕综合激情| 国产免费一区二区三区在线观看| 国产成人高清亚洲综合| 北川| 国语精品自产拍在线观看网站| 97精品伊人久久久大香线蕉| 国产精品一区二区三区四区| 美女一区二区三区亚洲麻豆| 久久se精品一区精品二区国产| 熟女国产精品一区二区三| 好爽毛片一区二区三区四| 亚洲欧美日韩在线码| 国偷自产视频一区二区久| 欧洲亚洲成av人片天堂网| 国产线播放免费人成视频播放 | 国产微拍一区二区三区四区| 婷婷国产成人精品视频| 亚洲高清 一区二区三区| 老师扒下内裤让我爽了一夜| 日本高清视频色欧WWW| 九九热在线精品视频观看| 亚洲欧美综合一区二区三区| 国产69久久精品成人看| 洮南市| 国产精品视频亚洲二区| 在线观看国产成人av天堂| 亚洲精品揄拍自拍首页一| 日韩丝袜亚洲国产欧美一区|