同步线程创建和销毁(静态)对象
Synchronize threads' creation and destruction of (static) object
我知道这个标题很糟糕,但(目前)我无法想出更好的东西
假设我有几个对象,类的实例如下:
class MyWorker: public Thread
{
public:
void Reconnect(...);
//...
private:
void DoDisconnect();
ConnectionPtr m_ptrConnection;
};
这些对象中的每一个都是独立的线程。ConnectionPtr
是一个引用计数智能指针。
Reconnect
首先执行DoDisconnect
,它只是取消m_ptrConnection
(以减少参考计数器),然后执行ConnectionFactory::Create
:
class ConnectionFactory
{
private:
ConnectionFactory();
public:
ConnectionPtr Create( ... );
private:
//...
void Destroy();
static m_mutex;
static ConnectionPtr m_ptrConnection;
};
这里,Create( ... )
调用Destroy()
,然后重新初始化m_ptrConnection
成员并将其作为结果返回。
其想法是,MyWorker
的所有实例都将使用相同的Connection
(这到底是什么并不重要)。
问题如下:MyWorker
的所有实例必须首先调用其DoDisconnect
(以减少引用计数器),然后执行Create
(当Create
执行Destroy
时,Connection
的引用计数器必须为1(仅静态指针应为非NULL))。
想法我如何才能做到这一点?
我知道,这听起来像是一个糟糕的设计和"过于本地化"。我不能改变MyWorker
的设计以及Reconnect
首先调用DoDisconnect
的事实。如果有人有更好的想法,我可以稍微改变ConnectioFactory
的设计
当前,我锁定静态mutex
以同步对m_ptrConnection
的访问。如果CCD_ 24已经被其他线程重新初始化,则CCD_
唯一的问题是,如何确保所有MyWorker
线程都先执行了它们的DoDisconnect
?以某种方式使用第二个mutex
?或者一些静态线程安全(原子)计数器
[来自问题评论]
您可以在DoDisConnect
和Destroy
之间插入线程屏障,以确保所有线程都在Destroy
之前完成了DoDisconnect
。为了获得一些想法,您可以查看使用mutex
和condition_variable
的boost实现。
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- 我可以读取静态对象中的文件.txt吗?C++
- 通过 Gazebo 世界插件将静态对象附加到机器人链接
- 将对象创建为全局/静态对象会崩溃,而本地对象不会崩溃
- 内联函数的函数本地静态对象是否在共享对象文件之间共享?
- 将 C# 对象(包含静态对象成员)作为参数传递给 C++/CLI 程序
- 完全释放静态对象内存
- 静态对象指针
- C++文件中.cpp静态对象声明
- C++类中定义静态对象
- 在初始化类的静态对象之前,是否保证初始化该类的静态成员?
- 静态对象如何调用私有构造函数
- cpp 静态对象实例化
- 等效于 Java 静态对象类C++
- 我怎么知道C++编译器是否制作线程安全的静态对象代码
- 在dlclose()之前破坏的静态对象
- 有没有办法为静态对象成员定义一个符合开关标准的常量?
- c++ 防止类共享静态对象
- 什么时候构造函数为静态对象
- 为什么本地静态对象的初始化使用隐藏的防护标志?