无锁编程,就是编译器不再使用系统中关于锁的 API,而是直接通过使用缓存一致性等算法达到锁的目的的一种编程。

可以使用 std::atomic<T> 系列和 __sync_val_compare_and_swap 系列均是无锁编程的体现。

栗子:

#include <iostream>
#include <thread>
#include <mutex>
#include <atomic>
#include <chrono>std::atomic<int> g_count(0);void iplusplus()
{int c = 10000000; //循环次数while (c--)g_count++;return;
}
int main()
{std::chrono::steady_clock::time_point start_time = std::chrono::steady_clock::now(); //开始时间std::thread thread1(iplusplus);std::thread thread2(iplusplus);thread1.join(); // 等待线程1运行完毕thread2.join(); // 等待线程2运行完毕std::cout << "count = " << g_count << std::endl;std::chrono::steady_clock::time_point stop_time = std::chrono::steady_clock::now(); //结束时间std::chrono::duration<double> time_span = std::chrono::duration_cast<std::chrono::microseconds>(stop_time - start_time);std::cout << "共耗时:" << time_span.count() << " ms" << std::endl; // 耗时system("pause");return 0;
}

或者

#include <iostream>
#include <thread>
#include <mutex>
#include <atomic>
#include <chrono>int g_count = 0;void iplusplus()
{int c = 10000000; //循环次数int old = g_count;while (c--){old = g_count;while (!__sync_bool_compare_and_swap(&g_count, old, g_count + 1))old = g_count;}return;
}
int main()
{std::chrono::steady_clock::time_point start_time = std::chrono::steady_clock::now(); //开始时间std::thread thread1(iplusplus);std::thread thread2(iplusplus);thread1.join(); // 等待线程1运行完毕thread2.join(); // 等待线程2运行完毕std::cout << "count = " << g_count << std::endl;std::chrono::steady_clock::time_point stop_time = std::chrono::steady_clock::now(); //结束时间std::chrono::duration<double> time_span = std::chrono::duration_cast<std::chrono::microseconds>(stop_time - start_time);std::cout << "共耗时:" << time_span.count() << " ms" << std::endl; // 耗时system("pause");return 0;
}

无锁编程的优点如下:

  • 避免死锁
  • 代码更加清晰
  • 提高性能

(SAW:Game Over!)

Cpp / 无锁编程相关推荐

  1. 【C++】多线程与原子操作和无锁编程【五】

    [C++]多线程与原子操作和无锁编程[五] 1.何为原子操作 前面介绍了多线程间是通过互斥锁与条件变量来保证共享数据的同步的,互斥锁主要是针对过程加锁来实现对共享资源的排他性访问.很多时候,对共享资源 ...

  2. 我是如何一步步的在并行编程中将lock锁次数降到最低实现无锁编程

    在并行编程中,经常会遇到多线程间操作共享集合的问题,很多时候大家都很难逃避这个问题做到一种无锁编程状态,你也知道一旦给共享集合套上lock之后,并发和伸缩能力往往会造成很大影响,这篇就来谈谈如何尽可能 ...

  3. 帖子如何实现显示浏览次数_我是如何一步步的在并行编程中将lock锁次数降到最低实现无锁编程...

    在并行编程中,经常会遇到多线程间操作共享集合的问题,很多时候大家都很难逃避这个问题做到一种无锁编程状态,你也知道一旦给共享集合套上lock之后,并发和伸缩能力往往会造成很大影响,这篇就来谈谈如何尽可能 ...

  4. 浅谈Linux内核无锁编程原理

    非阻塞型同步 (Non-blocking Synchronization) 简介 如何正确有效的保护共享数据是编写并行程序必须面临的一个难题,通常的手段就是同步.同步可分为阻塞型同步(Blocking ...

  5. 【翻译】RUST无锁编程

    本文内容译自Lock-freedom without garbage collection,中间有少量自己的修改. 人们普遍认为,垃圾收集的一个优点是易于构建高性能的无锁数据结构.对这些数据结构进行手 ...

  6. 无锁编程与有锁编程的效率总结、无锁队列的实现(c语言)

    1.无锁编程与有锁编程的效率 无锁编程,即通过CAS原子操作去控制线程的同步.如果你还不知道什么使CAS原子操作,建议先去查看相关资料,这一方面的资料网络上有很多. CAS实现的是硬件级的互斥,在线程 ...

  7. 【算法】CAS的实现和无锁编程

    CAS(Compare and swap,比较与交换) 是一种有名的无锁算法.比较与交换,先比较,发现与预期一致,说明没有其他线程改动过,于是再交换.如果与预期不一致说明改动过,就再来一次. 与各类锁 ...

  8. 无锁编程(Lock Free)框架 系列文章

    无锁编程(Lock Free)框架 系列文章: 1 前置知识:伪共享 原理 & 实战 2 disruptor 使用和原理 图解 3 akka 使用和原理 图解 4 camel 使用和 原理 图 ...

  9. 交易系统开发技能及面试之无锁编程(Lock-free)

    目录 概要 Q1 什么是atomic? Q2 alignas 关键字 Q3 C++的内存模型 relaxed ordering, release-acquire ordering, sequentia ...

最新文章

  1. pandas删除数据行中的重复数据行、基于dataframe所有列删除重复行、基于特定数据列或者列的作何删除重复行、删除重复行并保留重复行中的最后一行、pandas删除所有重复行(不进行数据保留)
  2. webservice mysql配置_Nginx配置WebService、MySQL、SQL Server、ORACLE等代理
  3. 微软2022新bug:大量程序员连夜加班,只因日期数据溢出
  4. 博弈论-囚徒困境与重复囚徒困境的启示
  5. MySQL创建用户与授权方法
  6. Android:Layout_weight的深刻理解
  7. 杂谈3之English
  8. 八种状态增加测试用例状态的精确度
  9. HDUOJ 1062 TEXT REVERSE
  10. ad域 禁用账号_IST-AD域信息同步平台来袭
  11. H5 自定义数据属性
  12. python中line.split_Python splitlines()方法
  13. 5.3.1 同步发生
  14. 《算法导论》之hash表
  15. X5045的C语言源码,X5045看门狗的单片机源程序和Proteus仿真原理图
  16. COleDateTime 使用方法
  17. solaris 10 虚拟机下安装双机
  18. 次时代Java编程(一):续 vertx-sync实践
  19. 【心电信号】基于matlab Simulink胎儿心电信号提取【含Matlab源码 1550期】
  20. mybatis入门笔记(一)

热门文章

  1. 12. 对日企4年的简单反省
  2. Adapte抽取操作
  3. 下载一首网络歌曲 该歌曲地址获取不到歌曲的大小,但可以正常播放
  4. sql语句中case when then 用法
  5. 开心复习-css3之路
  6. 电子商务淘宝网案例分析
  7. php视频主题,天兴工作室:zblog小视频主题 会员中心+全配色方案
  8. oracle hwm没有释放,如何去判断一张表的HWM是否高?
  9. ESP32基于Arduino框架,SD卡+MAX98357模块+MP3播放器
  10. 回味小时候拿着诺基亚玩的推箱子