所在的位置: C++ >> C++资源 >> C的Magicstatics

C的Magicstatics

北京湿疹医院那里好 http://pf.39.net/bdfyy/bdfal/210405/8814491.html
大约十二年前,在stackoverflow上有一个关于Meyers在他的《EffectiveC++》中给出的单实例模式的实现是否是线程安全的讨论,继而又有人提出了C++11中是否能保证局部静态变量的初始化是否线程安全的问题。说实话,在这之前我没仔细考虑过这个问题,我只是片面地认为静态局部变量虽然和其他局部变量的初始化规则不太一样,但是对于对象类型,它的构造函数在多线程环境下调用的时候应该是会发生竞争(Race)。这样理解也正确,也不正确,且看对这个问题深挖一下的结果。先来看看Meyers给出的单实例模式的实现代码:

staticSingletoninstance(){staticSingletons;returns;}

在这里先剧透一下,这个方案在C++11标准发布之前确实是线程不安全的,但是在C++11标准发布后这样的代码就没有线程安全问题了,这是为什么呢?我们就从Meyers的这个例子开始挖吧。

很多人的第一反应就是既然线程不安全,加个锁呗。请记住,锁是性能的绊脚石,遇到并发访问就加锁是个严重的陋习。对于这个单实例的例子来说,只有第一次的初始化是个写操作,需要用锁进行同步,后续的动作都是读操作,完全并发访问,并不需要锁,但是却都要被迫等锁,这就会造成潜在的性能问题,尤其时考虑到单实例对象的操作非常频繁的情况。对这个问题挖掘了一下就发现,实际上很多人都在挖这个问题,比如有人提出将“Double-CheckedLockingPattern(DCLP)”应用到单实例模式中,试图得到了一个既能解决多线程并发问题,也能尽量减少加锁开销的单实例实现方法。Meyers本人也在


转载请注明:http://www.aierlanlan.com/rzgz/181.html

  • 上一篇文章:
  •   
  • 下一篇文章: