YoungXie 发表于 2011-12-23 23:22:40

关于在多线程中使用ACE_Singleton的问题咨询!

应用场景:
定义了一个单例: typedef ACE_Singleton<type,ACE_Thread_Mutex> TYPE;这个type里定义了一个成员变量m_iA和一个成员函数mFun();

又新创建了一个线程,它会定时的执行这个TYPE里mFun()函数,目的是定时的探测里面的m_i值,可能会改变这个值可能不会。

现在问题来了:
1.我需要对这个mFun()加锁吗?或是里面值m_iA改变的时候进行加锁?
2.这个模板中得锁参数是干嘛用的?

winston 发表于 2011-12-24 09:47:00

要加锁;单体的锁只控制单体本身。

YoungXie 发表于 2011-12-26 21:01:57

恩,这个了解了。其实这个单体的锁就是针对单体本身而语言的,它只是保证单体中的内存的申请和销毁的不可重入性。

doublequick 发表于 2013-11-27 11:21:30

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]
查看完整版本: 关于在多线程中使用ACE_Singleton的问题咨询!