糟糕的标题,我知道,但是(现在)我想不出更好的东西
假设我有几个对象,类的实例是这样的:
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
. 如果已经被其他线程重新初始化,Create
则只会返回。
唯一的问题是,如何确保所有线程都已首先执行?以某种方式使用第二个?还是一些静态线程安全(原子)计数器?m_ptrConnection
MyWorker
DoDisconnect
mutex