首页 > 编程语言 > 详细

C++11 std::atomic

时间:2021-07-15 23:48:18      阅读:20      评论:0      收藏:0      [点我收藏+]

什么是原子数据类型?
从功能上看,简单地说,原子数据类型不会发生数据竞争,能直接用在多线程中而不必我们用户对其进行添加互斥资源锁的类型。从实现上,大家可以理解为这些原子类型内部自己加了锁。

#include <thread>
#include <atomic>
#include <iostream>
#include <list>
using namespace std;
// 使用原子类型
// atomic_int iCount(0);

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

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

int main(void) {
    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();
    }
    int x = iCount.load(memory_order_relaxed);
    printf("finally iCount:%d\r\n", x);

    // return value
    return 0;
}

运行结果:
技术分享图片

不用原子类型数据:

#include <thread>
#include <atomic>
#include <iostream>
#include <list>
using namespace std;
// 不用原子类型
int iCount = 0;

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

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

int main(void) {
    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);

    // return value
    return 0;
}

运行结果:
技术分享图片

小结:
Linux环境下运行,参数配置为:g++ -std=c++11 -pthread 14.atomictest.cpp,结果均为一样!

C++11 std::atomic

原文:https://www.cnblogs.com/skyzu2333/p/15017403.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!