wany031123 发表于 2010-12-15 15:15:05

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

小弟新人,对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不就失去作用了吗?

wesom 发表于 2010-12-15 15:34:07

类型安全?你问的是线程安全吧。。。
确实可能会出现你说的情况,有些编译器是先malloc内存,赋值,接着构造对象,这样的行为会导致线程不安全
我记得与编译器版本有关,现在的主流编译器应该不会有问题,貌似java是jdk1.4.*以上。。。其他的C++ complier版本不记得了
页: [1]
查看完整版本: DCL(双检测锁)如何保证类型安全?