欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++11并發(fā)編程關(guān)于原子操作atomic的代碼示例

 更新時間:2018年12月22日 11:37:27   作者:蝸牛201  
今天小編就為大家分享一篇關(guān)于C++11并發(fā)編程關(guān)于原子操作atomic的代碼示例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

一:概述

項(xiàng)目中經(jīng)常用遇到多線程操作共享數(shù)據(jù)問題,常用的處理方式是對共享數(shù)據(jù)進(jìn)行加鎖,如果多線程操作共享變量也同樣采用這種方式。

為什么要對共享變量加鎖或使用原子操作?如兩個線程操作同一變量過程中,一個線程執(zhí)行過程中可能被內(nèi)核臨時掛起,這就是線程切換,當(dāng)內(nèi)核再次切換到該線程時,之前的數(shù)據(jù)可能已被修改,不能保證原子操作。

C++11提供了個原子的類和方法atomic,保證了多線程對變量原子性操作,相比加鎖機(jī)制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,實(shí)際每次結(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相比使用加鎖機(jī)制性能有2~3倍提升,對于共享變量能用原子類型的就不要再用加鎖機(jī)制了。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接

相關(guān)文章

  • C語言巧用二分查找實(shí)現(xiàn)猜數(shù)游戲

    C語言巧用二分查找實(shí)現(xiàn)猜數(shù)游戲

    二分查找也稱折半查找(Binary?Search),它是一種效率較高的查找方法。但是,折半查找要求線性表必須采用順序存儲結(jié)構(gòu),而且表中元素按關(guān)鍵字有序排列,本篇文章教你用二分查找編寫猜數(shù)字游戲
    2022-02-02
  • C/C++檢測文件是否存在的常見方法

    C/C++檢測文件是否存在的常見方法

    在C和C++中,檢測文件是否存在的方法通常涉及到平臺特定的API或者使用標(biāo)準(zhǔn)庫的功能(在C++17及以后版本中),本文給大家介紹了C/C++檢測文件是否存在的幾種常見方法,感興趣的小伙伴跟著小編一起來看看吧
    2024-06-06
  • short與int轉(zhuǎn)換的小例子

    short與int轉(zhuǎn)換的小例子

    short與int轉(zhuǎn)換的小例子,需要的朋友可以參考一下
    2013-04-04
  • Qt實(shí)現(xiàn)實(shí)時鼠標(biāo)繪制圖形

    Qt實(shí)現(xiàn)實(shí)時鼠標(biāo)繪制圖形

    這篇文章主要介紹了Qt中QGraphicsView架構(gòu)下如何實(shí)現(xiàn)實(shí)時鼠標(biāo)繪制圖形,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起動手試一試
    2022-02-02
  • 使用C語言求解撲克牌的順子及n個骰子的點(diǎn)數(shù)問題

    使用C語言求解撲克牌的順子及n個骰子的點(diǎn)數(shù)問題

    這篇文章主要介紹了使用C語言求解撲克牌的順子及n個骰子的點(diǎn)數(shù)問題的方法,解答實(shí)例主要為了突出解題的算法,需要的朋友可以參考下
    2016-03-03
  • C語言實(shí)現(xiàn)獲取文件大小與創(chuàng)建修改時間

    C語言實(shí)現(xiàn)獲取文件大小與創(chuàng)建修改時間

    這篇文章主要為大家詳細(xì)介紹了如何通過C語言實(shí)現(xiàn)獲取文件大小、創(chuàng)建時間與修改時間,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • 淺析string類字符串和C風(fēng)格字符串之間的區(qū)別

    淺析string類字符串和C風(fēng)格字符串之間的區(qū)別

    string類是標(biāo)準(zhǔn)庫的類,并不是內(nèi)置類型,標(biāo)準(zhǔn)庫就像是我們自己定義的類差不多的,string類型對象沒有標(biāo)配'\0'結(jié)尾的
    2013-09-09
  • C語言運(yùn)算符深入探究優(yōu)先級與結(jié)合性及種類

    C語言運(yùn)算符深入探究優(yōu)先級與結(jié)合性及種類

    C語言運(yùn)算符號指的是運(yùn)算符號。C語言中的符號分為10類:算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位操作運(yùn)算符、賦值運(yùn)算符、條件運(yùn)算符、逗號運(yùn)算符、指針運(yùn)算符、求字節(jié)數(shù)運(yùn)算符和特殊運(yùn)算符
    2022-05-05
  • C++ set的使用方法詳解

    C++ set的使用方法詳解

    這篇文章主要介紹了C++ set的使用方法詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握set的使用方法,需要的朋友可以參考下
    2017-10-10
  • c++ 求數(shù)組最大最小值函數(shù)的實(shí)現(xiàn)

    c++ 求數(shù)組最大最小值函數(shù)的實(shí)現(xiàn)

    這篇文章主要介紹了c++ 求數(shù)組最大最小值函數(shù)的實(shí)現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07

最新評論