可怕的标题,我知道,但(现在)的破坏,我不能拿出更好的东西同步线程的创建和(静态)对象
假设我有几个对象,实例像这样的类:
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
。如果m_ptrConnection
已被某个其他线程重新初始化,则Create
将仅返回。
唯一的问题是,如何确保,所有MyWorker
线程都执行自己的DoDisconnect
第一?以某种方式使用第二个mutex
?或者一些静态线程安全(原子)计数器?
GRRRR,我不能在一个更好的和更短的方式解释这个.. – 2012-08-02 17:03:20
,如果我正确地理解你的问题,你可以简单地后'DoDisconnect',只是Destroy'之前'添加一个线程屏障。 – user2k5 2012-08-02 17:08:25
@ user2k5 - 什么是线程屏障?(听起来像这是我需要的,但仍然) – 2012-08-02 17:24:57