CppExplore

一切像雾像雨又像风

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  29 随笔 :: 0 文章 :: 280 评论 :: 0 Trackbacks

作者: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等代替。
智能指针有它使用的场景,不能滥用,也不能刻意避免。

posted on 2010-08-28 18:22 cppexplore 阅读(3939) 评论(12)  编辑 收藏 引用

评论

# re: 【原创】从同步互斥机制到智能指针使用成本 2010-08-31 02:08 trueOO
这才叫文章啊。。看看首页上都是些什么玩意啊  回复  更多评论
  

# re: 【原创】从同步互斥机制到智能指针使用成本 [未登录] 2010-09-01 19:03 Sea
同意
  回复  更多评论
  

# re: 【原创】从同步互斥机制到智能指针使用成本 2010-09-02 16:44 金庆
"线程之间尽量避免传递指针"? 能说明一下吗?传id和传指针有什么区别?  回复  更多评论
  

# re: 【原创】从同步互斥机制到智能指针使用成本 [未登录] 2010-09-04 11:16 cppexplore
@金庆
线程之间传递指针,基本就是传递智能指针。
传递id代替就是为了避免智能指针  回复  更多评论
  

# re: 【原创】从同步互斥机制到智能指针使用成本 2010-09-10 17:15 Markin
博主真乃超级技术达人,期待更多更好的技术贴,学习ing  回复  更多评论
  

# re: 【原创】从同步互斥机制到智能指针使用成本 2010-09-25 18:08 xwb
博主威武! 望尘莫及...@Markin
  回复  更多评论
  

# re: 【原创】从同步互斥机制到智能指针使用成本 [未登录] 2010-12-24 15:11 vincent
膜了个拜 啊  回复  更多评论
  

# re: 【原创】从同步互斥机制到智能指针使用成本 2011-03-24 14:50 egmkang
据说mutex在没有io的时候也是通过spinlock来实现互斥的.  回复  更多评论
  

# re: 【原创】从同步互斥机制到智能指针使用成本 2011-03-24 14:51 egmkang
当我没说,我转了一圈转回来了..  回复  更多评论
  

# re: 【原创】从同步互斥机制到智能指针使用成本 2011-03-28 12:45 cppexplore
@egmkang
:)  回复  更多评论
  

# re: 【原创】从同步互斥机制到智能指针使用成本 2011-06-05 08:27 Batiliu
引用:proactor机制实现的网络层,智能指针基本无法绕过,刻意避免带来的只能是丑陋的代码和维护量的上升。

LZ强人。本人在IOCP基础上实现proactorIO模型时,被资源释放困扰了N久,最后还是智能指针解的困,但现在还不够完美。

其他LZ谈谈相关的具体方案或心得,epoll也好iocp也好。  回复  更多评论
  

# re: 【原创】从同步互斥机制到智能指针使用成本 [未登录] 2011-07-14 22:25 kevin
@金庆
指针指向的内存地址可能无效。  回复  更多评论
  


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理