客户端软件,小心使用ACE_Singleton
近日使用ACE开发了客户端软件,测试出现一个重入的BUG,客户端注销后,再次进入会导致状态错误。经过跟踪分析发现,是使用ACE_Singleton引起的。因为ACE_Singleton使用非常便利,在程序里面使用了多个,但因为它是系统管理的,在注销后,这个对象无法释放,导致状态全部错误。改成ACE_Unmanaged_Singleton,自己管理对象的生命期就好了。
请大家注意别犯类似错误啊。 还有另外一个需要注意的事情 - 线程同步如果客户端需要反复调用你用ACE开发的组件,千万注意线程同步。
比如客户端的进入和退出,都调用了ACE的功能,而这个进入退出时间间隔很短,甚至迅速发生,一定要注意里面的线程要保证同步,该退出的退出。否则因为OS调度的缘故,很可能造成很奇怪的错误,其实都是线程不同步带来的。 客户端注销时,进程没退出么,如果进程结束的话就会释放singleton。如果要在进程不退出的情况下反复登录注销并使用同一singleton,需要每个客户端登录时重置(重新初始化)下该singleton。
singleton的语义就是与整个进程同生命周期的,如果每次客户端登陆都新生成一次,注销时再释放一次,就不符合singleton的语义了。 认可。
页:
[1]