2012-08-02 47 views
0

可怕的标题,我知道,但(现在)的破坏,我不能拿出更好的东西同步线程的创建和(静态)对象


假设我有几个对象,实例像这样的类:

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?或者一些静态线程安全(原子)计数器?

+0

GRRRR,我不能在一个更好的和更短的方式解释这个.. – 2012-08-02 17:03:20

+0

,如果我正确地理解你的问题,你可以简单地后'DoDisconnect',只是Destroy'之前'添加一个线程屏障。 – user2k5 2012-08-02 17:08:25

+0

@ user2k5 - 什么是线程屏障?(听起来像这是我需要的,但仍然) – 2012-08-02 17:24:57

回答

1

[从问题的评论]

您可以插入DoDisConnectDestroy之间的线程屏障,以确保所有线程Destroy之前已经完成DoDisconnect。为了得到一些想法,你可以看看的boost implementation,它采用mutexcondition_variable