找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4662|回复: 3

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

[复制链接]
发表于 2011-12-23 23:22:40 | 显示全部楼层 |阅读模式
应用场景:
定义了一个单例: typedef ACE_Singleton<type,ACE_Thread_Mutex> TYPE;这个type里定义了一个成员变量m_iA和一个成员函数mFun();

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

现在问题来了:
1.我需要对这个mFun()加锁吗?或是里面值m_iA改变的时候进行加锁?
2.这个模板中得锁参数是干嘛用的?
发表于 2011-12-24 09:47:00 | 显示全部楼层
要加锁;单体的锁只控制单体本身。
 楼主| 发表于 2011-12-26 21:01:57 | 显示全部楼层
恩,这个了解了。其实这个单体的锁就是针对单体本身而语言的,它只是保证单体中的内存的申请和销毁的不可重入性。
发表于 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 */:)
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-4-29 06:22 , Processed in 0.011864 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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