簡體   English   中英

同步線程對(靜態)對象的創建和銷毀

[英]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執行DestroyConnection的引用計數器必須為1(只是靜態指針應為non -空值) )。

我如何使這成為可能?

我知道這聽起來像是一個糟糕的設計,而且“太本地化了”。 我無法更改MyWorker的設計,也無法更改Reconnect首先調用DoDisconnect的事實。 如果有人有更好的主意,我可以稍微更改ConnectioFactory的設計。


當前,我鎖定靜態mutex以將訪問同步到m_ptrConnection 如果m_ptrConnection已經被其他線程重新初始化,則Create只會返回。
唯一的問題是,如何確保所有MyWorker線程都已首先執行其DoDisconnect 以某種方式使用第二個mutex 還是一些靜態線程安全(原子)計數器?

[來自問題的評論]

您可以在DoDisConnectDestroy之間插入一個線程屏障 ,以確保在Destroy之前所有線程都已完成DoDisconnect 為了獲得一些想法,您可以看一下boost實現 ,它使用mutexcondition_variable

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM