99热这里只有精品2-99热这里只有精品6免费-99热这里只有精品国产99-99热这里只有精品国产99热门精品-99热这里只有精品国产动漫

編程代碼
新聞詳情

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

發布時間:2021-01-05 11:48:12 瀏覽次數:2197

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


我們將一個數加一再減一,循環一定的次數,開啟20個線程來觀察,這個正確的結果應該是等于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;
}

以上程序運行時相關快的,但是結果卻是不正確的。

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();
    // 輸出結果
    cout << "result:" << total << endl;
    cout << "duration:" << finish - start << "ms" << endl;
 
    return 0;
}

我們可以看到運行結果是正確的,但是時間比原來慢太多了。雖然很無奈,但這也是沒有辦法的,因為只有在保證準確的前提才能去追求性能。

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

那有沒有什么辦法在保證準確的同時,又能提高性能呢?

原子操作就橫空出世了!

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

#include <atomic>

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

#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();
    // 輸出結果
    cout << "result:" << total << endl;
    cout << "duration:" << finish - start << "ms" << endl;
 
    return 0;
}

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

C++11多線程編程(四)——原子操作
在線客服 雙翌客服
客服電話
  • 0755-23712116
  • 13310869691
主站蜘蛛池模板: 国产高清视频在线免费观看| 91精品视频在线播放| 免费网站在线观看高清版| 狠狠色丁香婷婷综合最新地址| 国产精品免费αv视频| 手机看片福利日韩国产| 日韩在线一区二区三区| 国产精品免费播放| 日本黄色www| 国产一区二区三区在线电影| 精品视频一区二区三区在线播放| 国产精品一页| 中文 字幕 高清 在线| 女教师的一级毛片| 黄色片日韩| 日韩在线视频免费看| 久久在线免费视频| 国内自拍视频在线观看| 亚洲综合精品香蕉久久网97| 美国人与性xxxxxxx| 天天拍拍天天爽免费视频| 国产在线麻豆精品| 欧美a级片在线观看| 久久久久女人精品毛片| 国产高清国内精品福利99久久| 国产成人cao在线| aaa在线观看高清免费| 黄色一级片播放| 久久第一页| 黄色三级日本三级| 一级做一级爱a做片性视频视频| 欧美亚洲国产成人综合在线| 欧美制服| 欧美日韩成人在线观看| 免费一级a毛片免费观看欧美大片| 91最新入口| 国产男女乱淫真视频全程播放| 久久99精品一久久久久久| 国产乱码精品一区二区三区四川| 免费在线观看一级片| 九九精品在线播放|