作者:CppExplore  http://www.cppblog.com/CppExplore/和http://blog.csdn.net/cppexplore同步发布

一 semaphore机制
古老的信号量机制,80年代初,从System V体系中产生,称为System v信号量。90年代,Posix标准确立,其中的信号量称为posix信号量。当前linux系统支持这两种信号量(man semget/ man sem_post)。System v信号量为有名信号量,可以用于多进程间的互斥同步。posix信号量分有名和无名两种,当前linux只支持无名信号量,可以用于多线程之间的互斥同步,通过共享内存也可以用于多进程之间。
信号量属于内核级别的互斥同步机制,相关调用总是陷入内核态,属于功能强大/重量级的实现。

二 spinlock机制
多核SMP的cpu流行后,出现的新的互斥同步机制。spinlock实现原理为用户态循环尝试机制,不陷入内核态进行线程切换。spinlock的原子性通过CAS(CompareAndSwap)原语实现。使用spinlock时,应该保证保护区间内代码执行迅速,不应该存在io等耗时操作。

多核系统下,针对可快速执行的保护区使用用户态循环尝试机制,可以保证执行线程不需要引起上下文切换即可快速执行通过,这种机制也被形象的称为lock-free机制。我们可以这样理解:lock-free机制即为循环尝试,spinlock是它的具体实现。

spinlock的实现有多种,常见的有pthread_spin_lock,该spinlock无限制循环尝试,在多核环境下并且保护区代码执行迅速时,执行线程很快可以拿到锁,但当单核环境或者保护区代码执行慢速时,则会耗尽该线程拥有的时间片之后交出cpu,造成cpu的浪费。另一常见的spinlock是boost智能指针中的实现,进行3次无间断的循环CAS原语判断,之后若再次失败,则调用sleep族函数,交出cpu执行权,待再次分配到cpu时间片后继续进行CAS原语判断操作。

三 mutex机制
mutex属于os之上的再次封装实现。在linux2.6内核上,线程库为nptl,其中的mutex基于futex机制实现,它的实现原理,简单说就是spinlock+semaphore,首先使用spinlock尝试,可以拿到锁则直接向下执行,拿不到锁则执行semaphore机制,陷入内核态,进入线程切换。
在多核环境下,当mutex保护的代码段内无io操作,执行很快时,大多数情况下通过spinlock都可拿到锁,不需要陷入内核态。

四 为智能指针正名(boost)
智能指针的引用计数仅仅为一个整型变量的增减,属于执行迅速的典型,使用spinlock机制保护,最新boost版本中仅仅是spinlock,而非mutex。从性能角度说,使用智能指针的现象是cpu略微上升(循环尝试导致),而并发量/单个请求的响应时间并无明显影响。proactor机制实现的网络层,智能指针基本无法绕过,刻意避免带来的只能是丑陋的代码和维护量的上升。但线程之间尽量避免传递指针(智能指针),通过传递id等代替。
智能指针有它使用的场景,不能滥用,也不能刻意避免。

从同步互斥机制到智能指针使用成本相关推荐

  1. 【c++基础】第五章 RALL机制与智能指针

    第五章 RALL机制与智能指针 RAII机制 auto_ptr资源所有权转移智能指针 独占智能指针unique_ptr shared_ptr共享智能指针 weak_ptr破环指针 智能指针的问题与解决 ...

  2. 线程同步互斥机制--互斥锁

    目录 前言 一.互斥锁是什么? 二.互斥锁的使用 三.代码实现过程 1.初始化互斥锁 2.互斥锁上锁 3.互斥锁解锁 4.互斥锁释放 5.代码示例 四.死锁 前言 线程通信只需要操作共享的进程数据段即 ...

  3. Linux futex 快速同步互斥机制简介

    Futex,Fast Userspace muTEXes,作为linux下的一种快速同步(互斥)机制,已经存在了很长一段时间了(since linux 2.5.7).它有什么优势?又提供了怎样一些功能 ...

  4. 《深入浅出DPDK》读书笔记(五):同步互斥机制

    本文内容为读书笔记,摘自<深入浅出DPDK> 56.原子操作 原子(atom)本意是"不能被进一步分割的最小粒子",而原子操作(atomic operation)意为& ...

  5. python并发处理机制_Python并发编程—同步互斥

    同步互斥 线程间通信方法 1.通信方法:线程间使用全局变量进行通信 2.共享资源争夺 共享资源:多个进程或者线程都可以操作的资源称为共享资源.对共享资源的操作代码段称为临界区. 影响 : 对共享资源的 ...

  6. 关于 智能指针 的线程安全问题

    先说结论,智能指针都是非线程安全的. 多线程调度智能指针 这里案例使用的是shared_ptr,其他的unique_ptr或者weak_ptr的结果都是类似的,如下多线程调度代码: #include ...

  7. 【Boost】boost库中智能指针概述

    这篇文章主要介绍 boost中的智能指针的使用. 内存管理是一个比较繁琐的问题,C++中有两个实现方案: 垃圾回收机制和智能指针.垃圾回收机制因为性能等原因不被C++的大佬们推崇, 而智能指针被认为是 ...

  8. android ndk 智能指针,智能指针与弱引用详解

    在android 中可以广泛看到的template class Sp 句柄类实际上是android 为实现垃圾回收机制的智能指针.智能指针是c++ 中的一个概念,因为c++ 本身不具备垃圾回收机制,而 ...

  9. python线程死锁的原因,浅谈Python线程的同步互斥与死锁

    线程间通信方法 1. 通信方法 线程间使用全局变量进行通信 2. 共享资源争夺 共享资源:多个进程或者线程都可以操作的资源称为共享资源.对共享资源的操作代码段称为临界区. 影响 : 对共享资源的无序操 ...

最新文章

  1. eclipse让项目连接服务器失败,eclipse怎么链接服务器
  2. 蛇形矩阵c 语言怎么写,蛇形矩阵输出是要怎么写代码,感觉没有眉目啊,大佬能说一下思想吗...
  3. struts2中拦截器的使用
  4. 有钱了该不该提前还清房贷?
  5. atomQQ 笔记 之 列表元素的异步加载
  6. 算法实验-Sherwood型线性时间选择问题
  7. 在Ubuntu上使用MySQL设置远程数据库优化站点性能
  8. 制造业ERP系统具体操作流程是什么?
  9. hibernate mappedBy属性详解!
  10. python图形绘制星空图_绘图.md · 不是我/PyQt5-Chinese-tutorial - Gitee.com
  11. 微信小程序----实现YDUI的ScrollNav组件(滚动导航)
  12. 冬奥幕后故事:从低碳火炬到AI裁判,十四年后中国科技再上场
  13. python抢课_一个用python实现的东方时尚(驾校)抢课程序
  14. Ubuntu 18.04 WPS导出pdf部分线条变粗(okular的小问题)
  15. 实战演练 | Navicat Premium 轻松连接阿里云云数据库
  16. 既然android service是运行在主线程中的,那service还有什么用?
  17. 如何搭建一个自己的FTP服务器
  18. 关于子类重写父类方法的问题
  19. 西安交通大学第14周大计基
  20. Facebook商业模式分析

热门文章

  1. Appium 测试遇到问题解决方案
  2. 深入浅出事务的本质,附 OceanBase 事务解析14问
  3. “本地连接”找不到,怎么解决?
  4. Newman学习(一)
  5. 2023牛客寒假算法基础集训营6
  6. javascript:echarts 画基金周K线图
  7. java默认构造函数_Java中的默认构造函数
  8. TMG solvers for NX 1847/1872/1899/1926/1953 Series Win64
  9. ubuntu 热键设置_如何在Ubuntu中使用热键关闭显示器
  10. 慎用USES_CONVERSION