可怕的头衔,我知道,但(现在)我无法想出更好的东西
假设我有几个对象,类的实例如下:
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
?或者一些静态线程安全(原子)计数器?
答案 0 :(得分:1)
[来自问题的评论]
您可以在DoDisConnect
和Destroy
之间插入线程障碍,以确保所有线程在DoDisconnect
之前完成Destroy
。要了解一些信息,您可以查看使用mutex
和condition_variable
的{{3}}。