[英]Synchronize threads' creation and destruction of (static) object
我知道糟糕的標題,但(暫時)我無法提出更好的建議
假設我有幾個對象,例如此類的實例:
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
所有實例MyWorker
將使用相同的Connection
(這到底是什么並不重要)。
問題如下: MyWorker
所有實例必須先調用其DoDisconnect
(以減少引用計數器),然后執行Create
(當Create
執行Destroy
, Connection
的引用計數器必須為1(只是靜態指針應為non -空值) )。
我如何使這成為可能?
我知道這聽起來像是一個糟糕的設計,而且“太本地化了”。 我無法更改MyWorker
的設計,也無法更改Reconnect
首先調用DoDisconnect
的事實。 如果有人有更好的主意,我可以稍微更改ConnectioFactory
的設計。
當前,我鎖定靜態mutex
以將訪問同步到m_ptrConnection
。 如果m_ptrConnection
已經被其他線程重新初始化,則Create
只會返回。
唯一的問題是,如何確保所有MyWorker
線程都已首先執行其DoDisconnect
? 以某種方式使用第二個mutex
? 還是一些靜態線程安全(原子)計數器?
[來自問題的評論]
您可以在DoDisConnect
和Destroy
之間插入一個線程屏障 ,以確保在Destroy
之前所有線程都已完成DoDisconnect
。 為了獲得一些想法,您可以看一下boost實現 ,它使用mutex
和condition_variable
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.