编写一个可以用作静态但需要锁定的C类
我需要编写加载共享库的类. dlopen()/ dlerror()序列需要锁定才能是线程安全的.
这个类的用户(同时会有多个用户)希望使它成为这个类的静态成员,以避免为该类的每个对象多次加载共享库:
这段代码的问题在于它可能会崩溃,因为它依赖于程序终止时破坏静态的顺序.如果锁在myLib之前消失了它会崩溃…. 如何以安全的方式编写线程安全且不依赖于静态破坏的顺序? 最佳答案
不幸的是,我认为避免这种情况的唯一方法是使用不可移植的一次性初始化指令,并避免破坏锁.您需要处理两个基本问题:
>如果两个线程第一次竞争访问锁定会发生什么? [即,你不能懒惰 – 创建锁] 这些约束的组合迫使您使用非可移植机制来创建锁. 在pthreads上,最直接的处理方法是使用PTHREAD_MUTEX_INITIALIZER,它允许您静态初始化锁:
在Windows上,您可以使用synchronous one-time initialization. 或者,如果您可以保证在主运行之前只有一个线程,则可以使用单例模式而不会破坏,只需强制在main()之前触摸锁:
请注意,这使得可能不可移植(但很可能是真实的)假设POD类型的静态对象在所有非POD静态对象都被销毁之前不会被销毁.我不知道任何平台不是这种情况. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |