C++11 std::atomic

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

#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;
}

运行结果:
C++11 std::atomic

不用原子类型数据:

#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;
}

运行结果:
C++11 std::atomic

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

上一篇:b_hw/pdd_任务最大得分(堆/multiset)


下一篇:CF1493D GCD of an Array (分解定理+思维)