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不就失去作用了吗? 类型安全?你问的是线程安全吧。。。
确实可能会出现你说的情况,有些编译器是先malloc内存,赋值,接着构造对象,这样的行为会导致线程不安全
我记得与编译器版本有关,现在的主流编译器应该不会有问题,貌似java是jdk1.4.*以上。。。其他的C++ complier版本不记得了
页:
[1]