1. 程式人生 > >C++11多執行緒(十):atomic原子操作的高效率(例項)

C++11多執行緒(十):atomic原子操作的高效率(例項)

參考連結:http://blog.csdn.net/yockie/article/details/8838686

目錄
1.原子操作介紹
2.示例比較:不用鎖及原子(結果錯誤)
3.示例比較:用鎖(耗時)
4.示例比較:原子(更加簡便,省時)


1.原子操作介紹
所謂的原子操作,取的就是“原子是最小的、不可分割的最小個體”的意義,它表示在多個執行緒訪問同一個全域性資源的時候,能夠確保所有其他的執行緒都不在同一時間內訪問相同的資源。也就是他確保了在同一時刻只有唯一的執行緒對這個資源進行訪問。這有點類似互斥物件對共享資源的訪問的保護,但是原子操作更加接近底層,因而效率更高。

在以往的C++標準中並沒有對原子操作進行規定,我們往往是使用匯編語言,或者是藉助第三方的執行緒庫,例如intel的pthread來實現。在新標準C++11,引入了原子操作的概念,並通過這個新的標頭檔案提供了多種原子操作資料型別,例如,atomic_bool,atomic_int等等,如果我們在多個執行緒中對這些型別的共享資源進行操作,編譯器將保證這些操作都是原子性的,也就是說,確保任意時刻只有一個執行緒對這個資源進行訪問,編譯器將保證,多個執行緒訪問這個共享資源的正確性。從而避免了鎖的使用,提高了效率。

我們還是來看一個實際的例子。假若我們要設計一個廣告點選統計程式,在伺服器程式中,使用多個執行緒模擬多個使用者對廣告的點選。請看下面3個示例。

2.示例比較:不用鎖及原子
#include <iostream>       // std::cout
#include <atomic>         // std::atomic
#include <thread>         // std::thread
#include <vector>         // std::vector

long clickCnt = 0;


void ClickAdBoard()//點選廣告
{                
for (int i = 0; i < 100000; ++i) 
{
clickCnt++;
}   

};


int main()
{
std::vector<std::thread> threads;
for (int i = 1; i <= 10; ++i) threads.push_back(std::thread(ClickAdBoard));


for (auto& th : threads) th.join();
cout << "All Click Count:" << clickCnt << endl;


return 0;
}
本機輸出:444317
應為:1000000


3.示例比較:用鎖
分析:加鎖以後計算結果正確,但是非常耗時
#include "stdafx.h"
#include <iostream>
using namespace std; 
#include <thread>
#include <vector>
#include <mutex>
#include <atomic>         // std::atomic


mutex mtx;
long clickCnt = 0;


void ClickAdBoard()//點選廣告
{                
for (int i = 0; i < 100000; ++i) 
{
mtx.lock();
clickCnt++;
mtx.unlock();
}   

};


int main()
{
clock_t  startClock = clock();
std::vector<std::thread> threads;
for (int i = 1; i <= 10; ++i) threads.push_back(std::thread(ClickAdBoard));


for (auto& th : threads) th.join();
cout << "All Click Count:" << clickCnt << endl;


clock_t  endClock = clock();
cout << "耗時:" << endClock - startClock << "ms" << endl;


return 0;
}


All Click Count:1000000
耗時:29188ms
請按任意鍵繼續. . .

4.示例比較:原子(更加簡便,省時)
分析:簡便,省時
#include "stdafx.h"
#include <iostream>
using namespace std; 
#include <thread>
#include <vector>
#include <mutex>
#include <atomic>         // std::atomic


std::atomic<long> clickCnt(0);//廣告點選次數


void ClickAdBoard()//點選廣告
{                
for (int i = 0; i < 100000; ++i) 
{
clickCnt++;
}   

};


int main()
{
clock_t  startClock = clock();
std::vector<std::thread> threads;
for (int i = 1; i <= 10; ++i) threads.push_back(std::thread(ClickAdBoard));


for (auto& th : threads) th.join();
cout << "All Click Count:" << clickCnt << endl;


clock_t  endClock = clock();
cout << "耗時:" << endClock - startClock << "ms" << endl;


return 0;
}
輸出:
All Click Count:1000000
耗時:80ms
請按任意鍵繼續. . .

相關推薦

C++11執行():atomic原子操作高效率(例項)

參考連結:http://blog.csdn.net/yockie/article/details/8838686目錄 1.原子操作介紹 2.示例比較:不用鎖及原子(結果錯誤) 3.示例比較:用鎖(耗時) 4.示例比較:原子(更加簡便,省時) 1.原子操作介紹所謂的原子操作,取的就是“原子是最小的、不可分割的最

C++11執行(一):《atomic型別詳解二:std::atomic

參考連結: http://www.cnblogs.com/haippy/p/3301408.html 不錯的部落格 http://www.cplusplus.com/reference/future/future/ cplusplus官網 目錄 1.std::atomic 基本介紹 2.std::atomic

C++11執行(一):《atomic 型別詳解三 std::atomic (續)》

參考連結:http://www.cnblogs.com/haippy/p/3304556.html 本文介紹C++11 標準庫中的 std::atomic 針對整形(integral)和指標型別的特化版本做了哪些改進。

C++11執行原子操作

原子操作是同時只能有一個執行緒執行一個操作,不用使用互斥量即可實現,但是速度慢,而且一般只支援原生的型別,不夠靈活。更多的用處是作為訊號量進行使用。 示例程式碼,以int為例子: #include <atomic> #include <thread> #i

C++11執行程式設計 第章: 使用packaged_task優雅的讓同步函式非同步執行

C++11 Multithreading – Part 10: packaged_task<> Example and Tutorial Varun July 2, 2017 C++11 Multithreading – Part 10: packaged_tas

Cocos2dx 3.0 過渡篇(二六)C++11執行std::thread的簡單使用

--------------- 《上》 本篇介紹的是執行緒! 在cocos2dx 2.0時代,我們使用的是pthread庫,是一套使用者級執行緒庫,被廣泛地使用在跨平臺應用上。但在cocos2dx 3.0中並未發現有pthread的支援檔案,原來c++11中已經擁有了一

[轉]c++11 執行 future/promise

[轉自 https://blog.csdn.net/jiange_zh/article/details/51602938] 1. < future >標頭檔案簡介 Classes std::future std::future_error std::packaged_task std::pro

c++11執行 thread

 1.thread建構函式 default (1) thread() noexcept; initialization (2) template <class Fn, class... Args> explicit

C++11 執行執行共享資料

共享資料的問題 這些在作業系統中都有詳細的介紹,可以回顧作業系統課程。。很典型的就是資料競爭問題。 互斥量保護資料 最原始的方式:使用std::mutex建立互斥量,使用成員lock()加鎖,使用成員unlock()解鎖。但是這種方式需要我們在每個函數出口都呼叫一次unloc

c++11執行執行

最近需要開發一個高效能運算庫,涉及到c++多執行緒的應用,上次做類似的事情已經是4年多以前了,印象中還頗有些麻煩。悔當初做了就算了,也沒想著留點記錄什麼的。這次又研究了一番,發現用上c++11特性之後,現在已經比較簡單了,在此記錄一下。   最簡單的多執行緒情況,不涉及公共變數,各個執行緒之間獨

C++11執行(1)

        C++11中添加了duox多執行緒類,編寫C++程式可以直接使用C++11中的多執行緒庫,不必依賴於平臺多執行緒,這樣可以方便寫出誇平臺的多執行緒程式。多執行緒可以最大化利用計算機資源,提高程式碼的執行效率。         C++11中thread類提供兩

C++ 11 執行下std::unique_lock與std::lock_guard的區別和用法

這裡主要介紹std::unique_lock與std::lock_guard的區別用法 先說簡單的 一、std::lock_guard的用法 std::lock_guard其實就是簡單的RAII封裝,在建構函式中進行加鎖,解構函式中進行解鎖,這樣可以保證函式退出時,鎖一定被釋放。 簡單來說,就是防止開

C++11執行------std::async

std::async可以認為是封裝了一個std::promise,該函式返回一個std::future,用於獲取其他執行緒的資料。 一般有兩種模式: std::lanch::async:最常用的非同步模式,每次都要執行一遍 std::lanch::defer:只在第

C++11執行---互斥量、鎖、條件變數的總結

關於互斥量std::mutex的總結 互斥量用於組成程式碼的臨界區。C++的多執行緒模型是基於記憶體的,或者說是基於程式碼片段的,這和我們作業系統學習的臨界區概念基本一致,但是與Golang不同,Golang是基於訊息模型的。 一個std::mutex的lock()和unlock

C++ 11 執行--執行管理

說到多執行緒程式設計,那麼就不得不提並行和併發,多執行緒是實現併發(並行)的一種手段。並行是指兩個或多個獨立的操作同時進行。注意這裡是同時進行,區別於併發,在一個時間段內執行多個操作。在單核時代,多個執行緒是併發的,在一個時間段內輪流執行;在多核時代,多個執行緒可以實現真正的並行,在多核上真正獨立的並行執行。

C++11執行程式設計 緒論及總結

C++11多執行緒程式設計 這一系列文章是從 https://thispointer.com/c11-multithreading-tutorial-series/ 轉過來的, 本來想翻譯一下, 但看了些內容, 用詞都不難, 讀英文沒有太大難度, 翻譯過來反而怕用詞不準畫蛇添

C++11執行程式設計 第九章: std::async 更更優雅的寫執行

C++11 Multithreading – Part 9: std::async Tutorial & Example Varun May 5, 2017 C++11 Multithreading – Part 9: std::async Tutorial &

C++11執行程式設計 第八章: 使用 std::future std::promise 更優雅的獲取執行返回值

C++11 Multithreading – Part 8: std::future , std::promise and Returning values from Thread Varun June 20, 2015 C++11 Multithreading – Part

C++11執行程式設計 第七章: 條件變數及其使用方法

C++11 Multithreading – Part 7: Condition Variables Explained Varun June 2, 2015 C++11 Multithreading – Part 7: Condition Variables Explain

C++11執行程式設計 第五章: 使用鎖來解決竟態條件

C++11 Multithreading – Part 5: Using mutex to fix Race Conditions Varun February 22, 2015 C++11 Multithreading – Part 5: Using mutex to fi