找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4976|回复: 1

DCL(双检测锁)如何保证类型安全?

[复制链接]
发表于 2010-12-15 15:15:05 | 显示全部楼层 |阅读模式
小弟新人,对DCI(双检测锁)不是很理解,请大家指教!
ACE_Thread_Manager::instance (void)
{
  ACE_TRACE ("ACE_Thread_Manager::instance");

  if (ACE_Thread_Manager::thr_mgr_ == 0)
    {
      // Perform Double-Checked Locking Optimization.
      ACE_MT (ACE_GUARD_RETURN (ACE_Recursive_Thread_Mutex, ace_mon,
                                *ACE_Static_Object_Lock::instance (), 0));

      if (ACE_Thread_Manager::thr_mgr_ == 0)
        {
          ACE_NEW_RETURN (ACE_Thread_Manager::thr_mgr_,
                          ACE_Thread_Manager,
                          0);
          ACE_Thread_Manager::delete_thr_mgr_ = 1;
        }
    }
  return ACE_Thread_Manager::thr_mgr_;
}


  ACE_MT (ACE_GUARD_RETURN (ACE_Recursive_Thread_Mutex, ace_mon,
                                *ACE_Static_Object_Lock::instance (), 0));这句据我分析应该是获取LOCK的状态,如果已有线程进入
if (ACE_Thread_Manager::thr_mgr_ == 0)
        {
          ACE_NEW_RETURN (ACE_Thread_Manager::thr_mgr_,
                          ACE_Thread_Manager,
                          0);
          ACE_Thread_Manager::delete_thr_mgr_ = 1;
        }
lock状态应该是锁定的,不知道是否正确?

if (ACE_Thread_Manager::thr_mgr_ == 0)
        {
          ACE_NEW_RETURN (ACE_Thread_Manager::thr_mgr_,
                          ACE_Thread_Manager,
                          0);
          ACE_Thread_Manager::delete_thr_mgr_ = 1;
        }
这里有点疑虑,这里能保证类型安全吗?
ACE_NEW_RETURN (ACE_Thread_Manager::thr_mgr_,
                          ACE_Thread_Manager,
                          0);
编译器或处理器都为了提高性能都有可能进行指令的乱序执行,线程一的真正执行步骤可能是1) 分配内存 2) thr_mgr_指向新对象 3) 初始化新实例。如果线程二在2完成后3执行前被唤醒,它看到了一个不为null的thr_mgr_,,跳出方法体走了,带着一个还没初始化的 ACE_Thread_Manager对象,这样DCL不就失去作用了吗?
发表于 2010-12-15 15:34:07 | 显示全部楼层
类型安全?你问的是线程安全吧。。。
确实可能会出现你说的情况,有些编译器是先malloc内存,赋值,接着构造对象,这样的行为会导致线程不安全
我记得与编译器版本有关,现在的主流编译器应该不会有问题,貌似java是jdk1.4.*以上。。。其他的C++ complier版本不记得了
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-22 03:38 , Processed in 0.020917 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表