91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++11并發編程關于原子操作atomic的代碼示例

發布時間:2020-09-20 01:04:12 來源:腳本之家 閱讀:229 作者:蝸牛201 欄目:編程語言

一:概述

項目中經常用遇到多線程操作共享數據問題,常用的處理方式是對共享數據進行加鎖,如果多線程操作共享變量也同樣采用這種方式。

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

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()
{
  //創建線程1
  thread t1(fun);
  //創建線程2
  thread t2(fun);
  t1.join();
  t2.join();
  cout << g_num << endl;
  getchar();
  return 1;
}

應該輸出結果20000000,實際每次結果都不一樣,總是小于該值,正是由于多線程操作同一變量而沒有保證原子性導致的。

三:加鎖代碼

//全局變量
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()
{
  //獲取當前毫秒時間戳
  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();
  //創建線程
  thread t1(fun);
  thread t2(fun);
  t1.join();
  t2.join();
  cout << "總數:" << g_num << endl;
  //獲取當前毫秒時間戳
  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;
}

執行結果:多次測試輸出均為20000000,耗時在3.8s左右

C++11并發編程關于原子操作atomic的代碼示例

四:atomic原子操作代碼

//全局變量
atomic<int> g_num = 0;
void fun()
{
  for (int i = 0; i < 10000000; i++)
  {
    g_num++;
  }
  return ;
}
int main()
{
  //獲取當前毫秒時間戳
  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();
  //創建線程
  thread t1(fun);
  thread t2(fun);
  t1.join();
  t2.join();
  cout << "總數:" << g_num << endl;
  //獲取當前毫秒時間戳
  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;
}

執行結果:多次測試輸出均為20000000,耗時在1.3s左右

C++11并發編程關于原子操作atomic的代碼示例

五:小結

c++11的原子類atomic相比使用加鎖機制性能有2~3倍提升,對于共享變量能用原子類型的就不要再用加鎖機制了。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。如果你想了解更多相關內容請查看下面相關鏈接

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

哈巴河县| 天镇县| 肥东县| 新邵县| 江陵县| 喀什市| 峨眉山市| 汕头市| 舟山市| 清河县| 南溪县| 济宁市| 普兰店市| 昭平县| 河西区| 慈溪市| 忻城县| 冷水江市| 海原县| 馆陶县| 武川县| 奉化市| 漳浦县| 海盐县| 唐山市| 类乌齐县| 察隅县| 湘潭县| 舟山市| 措勤县| 洱源县| 阿拉善右旗| 揭东县| 馆陶县| 宣恩县| 隆尧县| 商水县| 宜兴市| 安乡县| 花莲县| 鄂尔多斯市|