+ -
当前位置:首页 → 问答吧 → 有几行代码不明白,关于锁的

有几行代码不明白,关于锁的

时间:2010-07-27

来源:互联网

本帖最后由 sparkzh 于 2010-07-27 22:30 编辑
  1. volatile T* pInst = 0;
  2. T* GetInstance()
  3. {
  4. if (pInst == NULL)
  5. {
  6. lock();
  7. if (pInst == NULL)
  8. pInst = new T;
  9. unlock();
  10. }
  11. return pInst;
  12. }
复制代码
为什么要两个if (pInst == NULL),第二个不是多余的吗?
书上说是可以最大限度的降低调用lock的开销,但没讲原理。
请大虾讲讲

作者: sparkzh   发布时间: 2010-07-27

好像明白点儿了
其实多余的不是第二个,应该是第一个,但是有第一个在pInst不为NULL的情况下可以避免不必要的lock
第二个是必须有的,要不然多线程就乱了

作者: sparkzh   发布时间: 2010-07-27

liang  两个判断都是必须的,第二个必须的是开辟空间的时候,如果在第一个if判断后,lock前并发程序或者抢占或者时间片轮转--线程执行,这个时候可能已经分配空间,
   所以第二个可以防止内存泄露以及数据安全;

第一个可以减少锁冲突,比如n个并发线程,已经分配空间,那么n-1次锁冲突是多余的~~~~不能上来先加锁再说,然后在看是否需要分配空间;先判断一下是否需要空间,再申请锁,
到真实分配空间的时候,还需要次节点空间是否已经分配;

作者: zbhddt6   发布时间: 2010-07-27