【发布时间】:2012-11-24 16:51:48
【问题描述】:
我有一个包含静态成员“obj”的类。静态类成员 obj 本身包含一个静态成员(恰好是互斥类型的类)。
现在,当我的程序终止时,它会崩溃。当静态对象“obj”被破坏时,就会发生这种情况。 'obj' 的析构函数调用它的静态成员(我自己的互斥锁类型遵循 RAII 习语来破坏底层的低级对象)。不幸的是,这个成员碰巧已经被销毁了,因为静态对象的初始化顺序(->相反的析构函数顺序)是未定义的。
如何干净地生存下来?我很惊讶这种情况并没有更频繁地发生。一般来说,拥有静态的非 POD 成员似乎非常危险。尤其是如果您不太了解它们的内部结构。
【问题讨论】:
-
说真的,只是重新设计没有任何静态...除了拥有一个全局互斥锁是一个非常糟糕的想法。
-
一些源代码 sn-ps 会有所帮助。
-
@ybungalobill 如果不使用另一个互斥锁,您如何保护互斥锁的创建?在这个链中的某个时刻,您可能需要一个全局互斥锁。 (我知道,在开始线程之前创建所有需要的互斥锁会更干净。但在某些情况下,这违背了封装。)
-
互斥体被封装在类中,用于使类线程安全。为了保护所有实例,它必须是 static ='global'。这些实例共享一些共同的项目。谢谢大家的cmets!我想作为第一个治疗方法,我使包含互斥锁的类成员成为非静态的,并在这种情况下支付少量罚款以生成更多实例。然后我检查应该移动到单例。
标签: c++ static destruction