下面是实验代码和截图。

  • 需要确保自己的服务器CPU能支持RTM指令集,如何查看能否支持RTM指令集不做介绍
  • 编译指令:g++ test4.cc -std=c++11 -pthread -mrtm
  • -mrtm表示使用rtm指令集,需要导入头文件#include <immintrin.h>
#include <immintrin.h>
#include <sys/time.h>#include <iostream>
#include <thread>
#include <vector>
#include <mutex>using namespace std;int a1 = 0; // 使用无锁,无RTM来累加a1,结果肯定出错
int a2 = 0; // 设置mutex来累加a2,结果不会出错
int a3 = 0; // 使用RTM来累加a3,结果不会出错
mutex mtx;void func1() {for (int i = 0; i < 100000; i++) a1++;}
void func2() {mtx.lock();for (int i = 0; i < 100000; i++) a2++;mtx.unlock();
}void func3() {while (_xbegin() != _XBEGIN_STARTED) {}for (int i = 0; i < 100000; i++) a3++;_xend();
}int main() {struct timeval _start_tv, _end_tv;long long total_us;/*****************************************************************************/vector<thread> threads1;threads1.reserve(static_cast<size_t>(10));gettimeofday (&_start_tv, NULL);for (int i = 0; i < 10; ++i) {threads1.emplace_back(func1);}for (auto &t : threads1) {t.join();}gettimeofday (&_end_tv, NULL);total_us = (_end_tv.tv_sec - _start_tv.tv_sec) * 1000000 + (_end_tv.tv_usec - _start_tv.tv_usec);cout << "无锁,无RTM:"<< endl;cout << "a1 = " << a1 << endl;cout << "time = " << total_us << " 微秒" << endl << endl;/*****************************************************************************/vector<thread> threads2;threads2.reserve(static_cast<size_t>(10));gettimeofday (&_start_tv, NULL);for (int i = 0; i < 10; ++i) {threads2.emplace_back(func2);}for (auto &t : threads2) {t.join();}gettimeofday (&_end_tv, NULL);total_us = (_end_tv.tv_sec - _start_tv.tv_sec) * 1000000 + (_end_tv.tv_usec - _start_tv.tv_usec);cout << "使用mutex锁: "<< endl;cout << "a2 = " << a2 << endl;cout << "time = " << total_us << " 微秒" << endl << endl;/*****************************************************************************/vector<thread> threads3;threads3.reserve(static_cast<size_t>(10));gettimeofday (&_start_tv, NULL);for (int i = 0; i < 10; ++i) {threads3.emplace_back(func3);}for (auto &t : threads3) {t.join();}gettimeofday (&_end_tv, NULL);total_us = (_end_tv.tv_sec - _start_tv.tv_sec) * 1000000 + (_end_tv.tv_usec - _start_tv.tv_usec);cout << "使用RTM 事务内存: "<< endl;cout << "a3 = " << a3 << endl;cout << "time = " << total_us << " 微秒" << endl << endl;}// g++ test4.cc -std=c++11 -pthread -mrtm

输出如下:

如果加大a3的累加数量,RTM事务内存可能很长一段时间无法输出结果。

到底RTM指令集如何才能达到最佳使用效果,还请后来人研究。

TSX指令集之RTM无锁并发能加快速度吗?与mutex加锁比较相关推荐

  1. Java无锁并发详细教程

    问题提出 有如下需求,保证 account.withdraw 取款方法的线程安全 package cn.itcast;import java.util.ArrayList; import java.u ...

  2. 无锁并发的CAS为何如此优秀?

    Talk is cheap CAS(Compare And Swap),即比较并交换.是解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三个操作数--内存位置(V).预期原值(A)和新 ...

  3. java 无锁框架_高性能无锁并发框架 Disruptor,太强了!

    Java技术栈 www.javastack.cn 关注优质文章 Disruptor是一个开源框架,研发的初衷是为了解决高并发下队列锁的问题,最早由LMAX提出并使用,能够在无锁的情况下实现队列的并发操 ...

  4. 【java并发编程】无锁并发框架disruptor

    一.简介 Disruptor是一个高性能队列,研发的初衷是解决内部的内存队列的延迟问题,而不是分布式队列.基于Disruptor开发的系统单线程能支撑每秒600万订单. 使用场景:对延时要求很高的场景 ...

  5. Java并发编程,无锁CAS与Unsafe类及其并发包Atomic

    为什么80%的码农都做不了架构师?>>>    我们曾经详谈过有锁并发的典型代表synchronized关键字,通过该关键字可以控制并发执行过程中有且只有一个线程可以访问共享资源,其 ...

  6. Java并发编程-无锁CAS与Unsafe类及其并发包Atomic

    [版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/72772470 出自[zejian ...

  7. 学习笔记:Java 并发编程④_无锁

    若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 配套资料: ...

  8. JUC并发编程共享模型之无锁(五)

    5.1 问题引出 public interface Account {// 获取余额Integer getBalance();void withdraw(Integer amount);/*** 方法 ...

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

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

  10. 垃圾回收算法与实现系列-JVM无锁实现

    导语   为了确保多线程场景下数据安全,使用锁机制一直是一种优秀的解决方案,但是再高并发场景下,对锁的竞争可能成为性能瓶颈.为此,有出现了一种新的解决方案,被称为是非阻塞同步的方案.这种实现方式不需要 ...

最新文章

  1. 过拟合怎么产生的?防治措施?
  2. Java Annotation(注解)使用教程
  3. 关于“时间序列回归”,这些你必须知道的事!
  4. 报警服务器物理内存,服务器内存使用率优化
  5. GTK 4.0 图形工具包正式发布
  6. 配置jboss,mysql,seam,eclipse步骤(一)
  7. Rancher快速入门
  8. 如何下载武汉市OSM数据并导出为shp格式
  9. 三十三个免费匿名临时邮箱服务
  10. 有多少个斐波那契子数列(微软笔试题)
  11. php 微商城 开源,RF 微商城一款免费开源的基础销售功能的微商城正式发布
  12. 高德地图中自定义色块标识任意省市县区域
  13. STM32中的DMA控制器的使用
  14. 全球与中国线锯钢线市场深度研究分析报告
  15. wheelib: 一个为编程学习而生的C语言轮子库
  16. 中国集成电路产业人才白皮书北京发布--李武宜
  17. 第一部android手机,安卓手机诞生十年,第一部Android 一.零手机长这样
  18. 惠普 ProBook 笔记本下的 WIN10 解决 VMware 开启Intel VT-x问题
  19. STRM--用Oracle Streams wizard生成配置脚本
  20. 虚拟服务器 补丁,两种方法为VMware ESXi打补丁

热门文章

  1. ISO50001认证辅导,ISO50001能源管理体系认证至少符合以下条件
  2. ISO50001认证咨询,ISO50001能源管理体系认证企业初次审核需要准备的材料
  3. 基于python+boostrap的学校图书馆管理系统
  4. 2021年4大免费ER图工具
  5. 市场对php的需求分析,PHP 留言板功能需求分析
  6. 用python实现网上书店
  7. hualinux0.6 网络篇:你懂得路由器的种类吗?
  8. web-jsp(15) 购物车
  9. ##智能优化算法复习--免疫算法IA
  10. python酷q机器人_NoneBot+酷Q,打造QQ机器人