std::atomic和std::mutex区别

简介: 模板类std::atomic是C++11提供的原子操作类型,头文件 #include<atomic>。在多线程调用下,利用std::atomic可实现数据结构的无锁设计。

std::atomic介绍


模板类std::atomic是C++11提供的原子操作类型,头文件 #include<atomic>。在多线程调用下,利用std::atomic可实现数据结构的无锁设计。


和互斥量的不同之处在于,std::atomic原子操作,主要是保护一个变量,互斥量的保护范围更大,可以一段代码或一个变量。std::atomic确保任意时刻只有一个线程对这个资源进行访问,避免了锁的使用,提高了效率。


原子类型和内置类型对照表如下:

16e7af4bea8e4bcdb56492291b40203d.png

以下以两个简单的例子,比较std::mutex和std::atomic执行效率


atomic和mutex性能比较


使用std::mutex

#include "stdafx.h"
#include <iostream>
#include <ctime>
#include <mutex>
#include <thread>
#include<future>
std::mutex mtx;
int cnt = 0; 
void mythread()
{
  for (int i = 0; i < 1000000; i++)
  {
    std::unique_lock<std::mutex> lock(mtx);
    cnt++;
  }
}
int main()
{
  clock_t start_time = clock();
  std::thread t1(mythread);
  std::thread t2(mythread);
  t1.join();
  t2.join();
  clock_t cost_time = clock() - start_time;
  std::cout << "cnt= " << cnt << " 耗时:" << cost_time << "ms" << std::endl;
  return 0;
}

执行结果:

9dce752ed039066090c8489ff00349c8.png

使用std::atomic

#include <iostream>
#include <ctime>
#include <thread>
#include<future>
std::atomic<int> cnt(0);
void mythread()
{
  for (int i = 0; i < 1000000; i++)
  {
    cnt++;
  }
}
int main()
{
  clock_t start_time = clock();
  std::thread t1(mythread);
  std::thread t2(mythread);
  t1.join();
  t2.join();
  clock_t cost_time = clock() - start_time;
  std::cout << "cnt= " << cnt << " 耗时:" << cost_time << "ms" << std::endl;
  return 0;
}

执行结果如下:

f68bf26d9b85df04ec69f6c9fa773109.png

总结


通过以上比较,可以看出来,使用std::atomic,耗时比std::mutex低非常多,使用 std::atomic 能大大的提高程序的运行效率。

相关文章
|
15小时前
|
存储 前端开发 算法
C++线程 并发编程:std::thread、std::sync与std::packaged_task深度解析(一)
C++线程 并发编程:std::thread、std::sync与std::packaged_task深度解析
61 0
|
15小时前
|
C++
C++11 std::lock_guard 互斥锁
C++11 std::lock_guard 互斥锁
12 0
|
15小时前
|
存储 并行计算 Java
C++线程 并发编程:std::thread、std::sync与std::packaged_task深度解析(二)
C++线程 并发编程:std::thread、std::sync与std::packaged_task深度解析
74 0
|
15小时前
|
存储 C语言 C++
std::atomic 相关接口(来自cppreference.com)
std::atomic 相关接口(来自cppreference.com)
26 0
|
15小时前
|
算法 安全 编译器
理解和记忆std::atomic
理解和记忆std::atomic
22 0
|
15小时前
|
存储 设计模式 前端开发
【C++并发编程】std::future、std::async、std::packaged_task与std::promise的深度探索(二)
【C++并发编程】std::future、std::async、std::packaged_task与std::promise的深度探索
30 0
|
15小时前
|
并行计算 前端开发 安全
【C++并发编程】std::future、std::async、std::packaged_task与std::promise的深度探索(一)
【C++并发编程】std::future、std::async、std::packaged_task与std::promise的深度探索
68 0
|
15小时前
|
存储 前端开发 安全
【C++并发编程】std::future、std::async、std::packaged_task与std::promise的深度探索(三)
【C++并发编程】std::future、std::async、std::packaged_task与std::promise的深度探索
30 0
|
8月前
|
存储 安全
atomic_int
atomic_int
144 0
|
8月前
|
开发者
std::tuple还是struct?
std::tuple是C++11提供的新模板类,可以翻译为“元组”,可把多个不同类型的变量组合成一个对象。std::tuple可看做std::pair的泛化实现,std::pair包含两个元素,std::tuple 可以同时包含多个元素,它拥有 struct 的表现,但是无需定义实际的 struct,可用于一个函数返回多个值的场景下。