vs2017下原子操作和互斥锁性能比较

简介: vs2017下原子操作和互斥锁性能比较

所谓的原子操作,取的就是“原子是最小的、不可分割的最小个体”的意义,它表示在多个线程访问同一个全局资源的时候,能够确保所有其他的线程都不在同一时间内访问相同的资源。也就是他确保了在同一时刻只有唯一的线程对这个资源进行访问。这有点类似互斥对象对共享资源的访问的保护,但是原子操作更加接近底层,因而效率更高。

在以往的C++标准中并没有对原子操作进行规定,我们往往是使用汇编语言,或者是借助第三方的线程库,例如intel的pthread来实现。在新标准C++11,引入了原子操作的概念,并通过这个新的头文件提供了多种原子操作数据类型,例如,atomic_bool,atomic_int等等,如果我们在多个线程中对这些类型的共享资源进行操作,编译器将保证这些操作都是原子性的,也就是说,确保任意时刻只有一个线程对这个资源进行访问,编译器将保证,多个线程访问这个共享资源的正确性。从而避免了锁的使用,提高了效率。下面给出一个原子操作和互斥量的对比例子。

原子操作:

#include <iostream>
#include <thread>
#include <mutex>
#include <atomic>
using namespace std;
atomic_int num;
void run()
{
  for (int i = 0; i < 1000000; i++)
  {
    num++;
  }
}
int main()
{
  clock_t begin = clock();
  thread t1(run);
  thread t2(run);
  t1.join();
  t2.join();
  clock_t end = clock();
  cout << num << endl;
  cout << end - begin << endl;
  while (1);
  return 0;
}

运行时间:

互斥锁操作:

#include <iostream>
#include <thread>
#include <mutex>
#include <atomic>
using namespace std;
int num;
mutex m;
void run()
{
  for (int i = 0; i < 1000000; i++)
  {
    m.lock();
    num++;
    m.unlock();
  }
}
int main()
{
  clock_t begin = clock();
  thread t1(run);
  thread t2(run);
  t1.join();
  t2.join();
  clock_t end = clock();
  cout << num << endl;
  cout << end - begin << endl;
  while (1);
  return 0;
}

运行时间:

互斥对象的使用,保证了同一时刻只有唯一的一个线程对这个共享进行访问,从执行的结果来看,互斥对象保证了结果的正确性,但是也有非常大的性能损失,从刚才的297ms变成了现在的782,耗时只是使用mutex互斥对象的四分之一。

原子操作的实现跟普通数据类型类似,但是它能够在保证结果正确的前提下,提供比mutex等锁机制更好的性能,如果我们要访问的共享资源可以用原子数据类型表示,那么在多线程程序中使用这种新的等价数据类型,是一个不错的选择。

在中低程度的竞争下,原子变量能提供更高的可伸缩性(锁在发生竞争时会挂起线程,从而降低了CPU的使用率和共享内存总线上的同步通信量),而在高强度的竞争下,锁能够更有效地避免竞争。

相关文章
|
5月前
|
人工智能 数据可视化 前端开发
震惊,Github开源,真正让程序员效率提升 90%的AI辅助工具来啦!!!
Claude Code Viewer 是一款开源浏览器工具,将 Claude Code 的终端日志可视化,支持会话管理、Git Diff 查看、文件预览与定时任务,实现远程交互与多项目导航,提升 AI 编程效率。
1819 0
|
8月前
|
存储 监控 数据可视化
Java 大视界 -- 基于 Java 的大数据可视化在企业生产运营监控与决策支持中的应用(228)
本文探讨了基于 Java 的大数据可视化技术在企业生产运营监控与决策支持中的关键应用。面对数据爆炸、信息孤岛和实时性不足等挑战,Java 通过高效数据采集、清洗与可视化引擎,助力企业构建实时监控与智能决策系统,显著提升运营效率与竞争力。
|
7月前
|
人工智能 API
阿里云百炼API-KEY在哪查询?如何获取阿里云AI百炼大模型的API-KEY?
阿里云百炼是阿里云推出的AI大模型平台,用户可通过其管理控制台获取API-KEY。需先开通百炼平台及大模型服务,即可创建并复制API-KEY。目前平台提供千万tokens免费额度,详细操作流程可参考官方指引。
|
API 调度 C语言
互斥锁,自旋锁,原子操作的原理,区别和实现
v互斥锁,自旋锁,原子操作的原理,区别和实现
512 0
|
人工智能 API 开发工具
aisuite:吴恩达发布开源Python库,一个接口调用多个大模型
吴恩达发布的开源Python库aisuite,提供了一个统一的接口来调用多个大型语言模型(LLM)服务。支持包括OpenAI、Anthropic、Azure等在内的11个模型平台,简化了多模型管理和测试的工作,促进了人工智能技术的应用和发展。
919 1
aisuite:吴恩达发布开源Python库,一个接口调用多个大模型
|
安全 搜索推荐 数据安全/隐私保护
Python基础之破解加密压缩包
Python基础之破解加密压缩包
663 0
|
数据采集 JSON NoSQL
JSON转Markdown:我把阅读数据从MongoDB中导出转换为.md了
JSON转Markdown:我把阅读数据从MongoDB中导出转换为.md了
1809 0
JSON转Markdown:我把阅读数据从MongoDB中导出转换为.md了
|
网络协议 算法 网络架构
|
SQL 前端开发 Java
实现数据的搜索( 筛选 )功能
实现数据的搜索( 筛选 )功能
|
缓存 Java 数据库连接
从ORM到实践:Hibernate与JPA的详细指南
【6月更文挑战第25天】ORM技术如Hibernate和JPA简化了Java与数据库交互。Hibernate是流行的ORM框架,JPA是Java EE的规范,两者结合提供了高效的数据持久化方案。配置Hibernate涉及数据库连接和实体映射。通过注解定义实体类,如`@Entity`、`@Table`、`@Id`等。持久化操作通过Session接口完成,例如保存对象。缓存、加载策略(延迟加载 vs. 立即加载)和查询优化是提升性能的关键。理解这些概念有助于选择和优化ORM使用。
377 0

热门文章

最新文章