欧美日韩在线第一页-欧美日韩在线观看精品-欧美日韩在线观看一区二区-欧美日韩在线免费看-欧美日韩在线视频不卡一区二区三区

編程代碼
新聞詳情

C++11多線程編程(四)——原子操作

發(fā)布時(shí)間:2021-01-05 11:48:12 瀏覽次數(shù):1914

今天和大家說說C++多線程中的原子操作。首先為什么會(huì)有原子操作呢?這純粹就是C++這門語言的特性所決定的,C++這門語言是為性能而生的,它對性能的追求是沒有極限的,它總是想盡一切辦法提高性能。互斥鎖是可以實(shí)現(xiàn)數(shù)據(jù)的同步,但同時(shí)是以犧牲性能為代價(jià)的。口說無憑,我們做個(gè)實(shí)驗(yàn)就知道了。


我們將一個(gè)數(shù)加一再減一,循環(huán)一定的次數(shù),開啟20個(gè)線程來觀察,這個(gè)正確的結(jié)果應(yīng)該是等于0的。

首先是不加任何互斥鎖同步

#include <iostream>
#include <thread>
#include <atomic>
#include <time.h>
#include <mutex>
using namespace std;
 
#define MAX 100000
#define THREAD_COUNT 20
int total = 0;
void thread_task()
{
    for (int i = 0; i < MAX; i++)
    {
        total += 1;
        total -= 1;
    }
}
 
int main()
{
    clock_t start = clock();
    thread t[THREAD_COUNT];
    for (int i = 0; i < THREAD_COUNT; ++i)
    {
        t[i] = thread(thread_task);
    }
    for (int i = 0; i < THREAD_COUNT; ++i)
    {
        t[i].join();
    }
    
    clock_t finish = clock();
    cout << "result:" << total << endl;
    cout << "duration:" << finish - start << "ms" << endl;
    return 0;
}

以上程序運(yùn)行時(shí)相關(guān)快的,但是結(jié)果卻是不正確的。

C++11多線程編程(四)——原子操作

那么我們將線程加上互斥鎖mutex再來看看。

#include <iostream>
#include <thread>
#include <atomic>
#include <time.h>
#include <mutex>
using namespace std;
 
#define MAX 100000
#define THREAD_COUNT 20
 
int total = 0;
mutex mt;
 
void thread_task()
{
    for (int i = 0; i < MAX; i++)
    {
        mt.lock();
        total += 1;
        total -= 1;
        mt.unlock();
    }
}
 
int main()
{
    clock_t start = clock();
    thread t[THREAD_COUNT];
    for (int i = 0; i < THREAD_COUNT; ++i)
    {
        t[i] = thread(thread_task);
    }
    for (int i = 0; i < THREAD_COUNT; ++i)
    {
        t[i].join();
    }
    
    clock_t finish = clock();
    // 輸出結(jié)果
    cout << "result:" << total << endl;
    cout << "duration:" << finish - start << "ms" << endl;
 
    return 0;
}

我們可以看到運(yùn)行結(jié)果是正確的,但是時(shí)間比原來慢太多了。雖然很無奈,但這也是沒有辦法的,因?yàn)橹挥性诒WC準(zhǔn)確的前提才能去追求性能。

C++11多線程編程(四)——原子操作

那有沒有什么辦法在保證準(zhǔn)確的同時(shí),又能提高性能呢?

原子操作就橫空出世了!

定義原子操作的時(shí)候必須引入頭文件

#include <atomic>

那么如何利用原子操作提交計(jì)算的性能呢?實(shí)際上很簡單的。

#include <iostream>
#include <thread>
#include <atomic>
#include <time.h>
#include <mutex>
using namespace std;
 
#define MAX 100000
#define THREAD_COUNT 20
 
//原子操作
atomic_int total(0);
 
void thread_task()
{
    for (int i = 0; i < MAX; i++)
    {
        total += 1;
        total -= 1;
    }
}
 
int main()
{
    clock_t start = clock();
    thread t[THREAD_COUNT];
    for (int i = 0; i < THREAD_COUNT; ++i)
    {
        t[i] = thread(thread_task);
    }
    for (int i = 0; i < THREAD_COUNT; ++i)
    {
        t[i].join();
    }
    
    clock_t finish = clock();
    // 輸出結(jié)果
    cout << "result:" << total << endl;
    cout << "duration:" << finish - start << "ms" << endl;
 
    return 0;
}

可以看到,我們在這里只需要定義atomic_int total(0)就可以實(shí)現(xiàn)原子操作了,就不需要互斥鎖了。而性能的提升也是非常明顯的,這就是原子操作的魅力所在。

C++11多線程編程(四)——原子操作
在線客服 雙翌客服
客服電話
  • 0755-23712116
  • 13822267203
主站蜘蛛池模板: 亚洲精品国产经典一区二区 | 亚洲麻豆精品果冻传媒| 91精品视频在线看| 久久精品www| 国产精品久久久久久久毛片| 亚洲精品乱码久久久久久蜜桃欧美| 1313午夜精品美女爱做视频| 国产三级精品播放| 国产在线观看网址你懂得| 中文字幕1页| 亚洲成人在线视频观看| 131午夜美女爱做视频| 直接看黄的网站| 一级片黑人| 激情亚洲综合网| 国产主播久久| 日本a级毛片| 欧美日韩亚洲精品国产色| 俄国特级毛片www免| 亚洲综合激情另类图片专区| 亚洲图片二区| 91久久精品国产一区二区| 免费看片亚洲| 99在线精品视频免费观里| 国产三级精品三级国产| 国产 欧美 日韩 在线| 久久精品亚洲一区二区| 美女扣下面流白浆丝袜| 国产短视频在线| 中文字幕在线观| 日本69sex护士泡妞| 看日本黄色大片| 可以免费观看的黄色网址| 午夜精品国产爱在线观看不卡| 黄色片网站免费| 亚洲国产精品a一区二区三区| 亚洲精品456人成在线| 啪啪网站在线观看| 亚洲国产精品区| 五月婷婷丁香久久| 美女黄色网|