c++11 std::atomic

std::atomic為C++11封裝的原子數(shù)據(jù)類型。

什么是原子數(shù)據(jù)類型?

從功能上看,簡單地說,原子數(shù)據(jù)類型不會發(fā)生數(shù)據(jù)競爭,能直接用在多線程中而不必我們用戶對其進(jìn)行添加互斥資源鎖的類型。從實(shí)現(xiàn)上,大家可以理解為這些原子類型內(nèi)部自己加了鎖。

我們下面通過一個(gè)測試?yán)诱f明原子類型std::atomic_int的特點(diǎn)。

二 使用atomic版本

代碼

#include <thread>
#include <atomic>
#include <iostream>
#include <list>

using namespace std;

atomic_int iCount(0);

void threadfun1()
{
    for(int i =0; i< 1000; i++)
    {
        printf("iCount:%d\r\n",  iCount++);
    }    
}
void threadfun2()
{
    for(int i =0; i< 1000; i++)
    {
        printf("iCount:%d\r\n",  iCount--);
    }    
}

int main()
{
    std::list<thread> lstThread;
    for (int i=0; i< 100; i++)
    {
        lstThread.push_back(thread(threadfun1));
    }
    for (int i=0; i< 100; i++)
    {
        lstThread.push_back(thread(threadfun2));
    }
    
    for (auto& th: lstThread)
    {
        th.join();
    }

    //printf("finally iCount:%d\r\n",  iCount);
    int x = iCount.load(memory_order_relaxed);
    printf("finally iCount:%d\r\n",  x);
}

輸出

  g++   -std=c++14 -pthread -o out atomictest.cpp && ./out
iCount:-4
iCount:-3
iCount:-2
iCount:-1
finally iCount:0

最終結(jié)果為0

二 不使用atomic版本

#include <thread>
#include <atomic>
#include <iostream>
#include <list>

using namespace std;

int iCount=0;

void threadfun1()
{
    for(int i =0; i< 1000; i++)
    {
        printf("iCount:%d\r\n",  iCount++);
    }    
}
void threadfun2()
{
    for(int i =0; i< 1000; i++)
    {
        printf("iCount:%d\r\n",  iCount--);
    }    
}

int main()
{
    std::list<thread> lstThread;
    for (int i=0; i< 100; i++)
    {
        lstThread.push_back(thread(threadfun1));
    }
    for (int i=0; i< 100; i++)
    {
        lstThread.push_back(thread(threadfun2));
    }
    
    for (auto& th: lstThread)
    {
        th.join();
    }

    printf("finally iCount:%d\r\n",  iCount);
}

輸出

g++   -std=c++14 -pthread -o out atomictest.cpp && ./out
...
iCount:-9
iCount:-8
iCount:-7
iCount:-6
finally iCount:-5

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容