C++11并發(fā)編程關(guān)于原子操作atomic的代碼示例
一:概述
項目中經(jīng)常用遇到多線程操作共享數(shù)據(jù)問題,常用的處理方式是對共享數(shù)據(jù)進行加鎖,如果多線程操作共享變量也同樣采用這種方式。
為什么要對共享變量加鎖或使用原子操作?如兩個線程操作同一變量過程中,一個線程執(zhí)行過程中可能被內(nèi)核臨時掛起,這就是線程切換,當(dāng)內(nèi)核再次切換到該線程時,之前的數(shù)據(jù)可能已被修改,不能保證原子操作。
C++11提供了個原子的類和方法atomic,保證了多線程對變量原子性操作,相比加鎖機制mutex.lock(),mutex.unlock(),性能有幾倍的提升。
所需頭文件<atomic>
二:錯誤代碼
//全局變量 int g_num = 0; void fun() { for (int i = 0; i < 10000000; i++) { g_num++; } return ; } int main() { //創(chuàng)建線程1 thread t1(fun); //創(chuàng)建線程2 thread t2(fun); t1.join(); t2.join(); cout << g_num << endl; getchar(); return 1; }
應(yīng)該輸出結(jié)果20000000,實際每次結(jié)果都不一樣,總是小于該值,正是由于多線程操作同一變量而沒有保證原子性導(dǎo)致的。
三:加鎖代碼
//全局變量 int g_num = 0; mutex m_mutex; void fun() { for (int i = 0; i < 10000000; i++) { m_mutex.lock(); g_num++; m_mutex.unlock(); } return ; } int main() { //獲取當(dāng)前毫秒時間戳 typedef chrono::time_point<chrono::system_clock, chrono::milliseconds> microClock_type; microClock_type tp1 = chrono::time_point_cast<chrono::milliseconds>(chrono::system_clock::now()); long long time1 = tp1.time_since_epoch().count(); //創(chuàng)建線程 thread t1(fun); thread t2(fun); t1.join(); t2.join(); cout << "總數(shù):" << g_num << endl; //獲取當(dāng)前毫秒時間戳 microClock_type tp2 = chrono::time_point_cast<chrono::milliseconds>(chrono::system_clock::now()); long long time2 = tp2.time_since_epoch().count(); cout << "耗時:" << time2 - time1 << "ms" << endl; getchar(); return 1; }
執(zhí)行結(jié)果:多次測試輸出均為20000000,耗時在3.8s左右
四:atomic原子操作代碼
//全局變量 atomic<int> g_num = 0; void fun() { for (int i = 0; i < 10000000; i++) { g_num++; } return ; } int main() { //獲取當(dāng)前毫秒時間戳 typedef chrono::time_point<chrono::system_clock, chrono::milliseconds> microClock_type; microClock_type tp1 = chrono::time_point_cast<chrono::milliseconds>(chrono::system_clock::now()); long long time1 = tp1.time_since_epoch().count(); //創(chuàng)建線程 thread t1(fun); thread t2(fun); t1.join(); t2.join(); cout << "總數(shù):" << g_num << endl; //獲取當(dāng)前毫秒時間戳 microClock_type tp2 = chrono::time_point_cast<chrono::milliseconds>(chrono::system_clock::now()); long long time2 = tp2.time_since_epoch().count(); cout << "耗時:" << time2 - time1 << "ms" << endl; getchar(); return 1; }
執(zhí)行結(jié)果:多次測試輸出均為20000000,耗時在1.3s左右
五:小結(jié)
c++11的原子類atomic相比使用加鎖機制性能有2~3倍提升,對于共享變量能用原子類型的就不要再用加鎖機制了。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對我們的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
欄 目:C語言
本文標(biāo)題:C++11并發(fā)編程關(guān)于原子操作atomic的代碼示例
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/575.html
您可能感興趣的文章
- 01-10異步http listener 完全并發(fā)處理懲罰http懇求的小例子
- 01-10深入理解C/C++混合編程
- 01-10深入sizeof的使用詳解
- 01-10C語言編程時常犯十八個錯誤小結(jié)
- 01-10通過c++11改進我們的模式之改進命令模式
- 01-10linux c多線程編程實例代碼
- 01-10c語言socket多線程編程限制客戶端連接數(shù)
- 01-10C語言socket編程開發(fā)應(yīng)用示例
- 01-10c語言網(wǎng)絡(luò)編程-標(biāo)準(zhǔn)步驟(改進版)
- 01-10c語言網(wǎng)絡(luò)編程-標(biāo)準(zhǔn)步驟(比較簡單)


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 01-10delphi制作wav文件的方法
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11ajax實現(xiàn)頁面的局部加載
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實例總結(jié)
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置