关于在多线程中使用ACE_Singleton的问题咨询!
应用场景:定义了一个单例: typedef ACE_Singleton<type,ACE_Thread_Mutex> TYPE;这个type里定义了一个成员变量m_iA和一个成员函数mFun();
又新创建了一个线程,它会定时的执行这个TYPE里mFun()函数,目的是定时的探测里面的m_i值,可能会改变这个值可能不会。
现在问题来了:
1.我需要对这个mFun()加锁吗?或是里面值m_iA改变的时候进行加锁?
2.这个模板中得锁参数是干嘛用的? 要加锁;单体的锁只控制单体本身。 恩,这个了解了。其实这个单体的锁就是针对单体本身而语言的,它只是保证单体中的内存的申请和销毁的不可重入性。 template <class TYPE, class ACE_LOCK>
class ACE_Singleton : public ACE_Cleanup
ACE_LOCK是Double-Checked Locking Optimization模式现实在需要创建对象时,对检查(checking)进行序列化所用的锁类型,对于在多线程环境中执行的代码,需要使用ACE_Recursive_Thread_Mutex.
#if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
// Obtain a lock from the ACE_Object_Manager.The pointer
// is static, so we only obtain one per ACE_Singleton
// instantiation.
static ACE_LOCK *lock = 0;
if (ACE_Object_Manager::get_singleton_lock (lock) != 0)
// Failed to acquire the lock!
return 0;
ACE_GUARD_RETURN (ACE_LOCK, ace_mon, *lock, 0);
if (singleton == 0)
{
#endif /* ACE_MT_SAFE */
ACE_NEW_RETURN (singleton, (ACE_Singleton<TYPE, ACE_LOCK>), 0);
// Register for destruction with ACE_Object_Manager.
ACE_Object_Manager::at_exit (singleton, 0, typeid (TYPE).name ());
#if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
}
#endif /* ACE_MT_SAFE */:)
页:
[1]