2012-08-02 45 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