可怕的標題,我知道,但(現在)的破壞,我不能拿出更好的東西同步線程的創建和(靜態)對象
假設我有幾個對象,實例像這樣的類:
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