簡體   English   中英

如何在多線程程序中安全地銷毀共享對象?

[英]How can I destroy a shared object safely in a multi-threaded program?

我設計了一些課程。 就像這樣:

  1. ClientEntity可以具有多個實例。
  2. 創建ClientEntity對象時,將不會對其進行修改,因此我不使用互斥體。
  3. 可以在不同線程之間訪問ClientEntity對象。
  4. 當它們收到一些退出命令時, ClientEntity對象將被銷毀。
  5. 一些線程可以訪問ClientEntity對象。

如何安全地銷毀該物體?

class ClientEntity
{
public:
    conference_info & conf_info (){return conf_info_;}
    void conf_info(const conference_info &ci){conf_info_ = ci;}

    user_info & usr_info(){return usr_info_;}
    void usr_info(const user_info &ui){usr_info_ = ui;}

private:
    web_conf_info *wci_;
    user_info usr_info_;
    conference_info conf_info_;

    // .....
};

class user_info
{
public:
    user_info & operator = (const user_info &ui)
    {   
        if (this != &ui){
            user_id = ui.user_id;
            user_name = ui.user_name;
            user_role = ui.user_role;
        }   

        return *this;
    }   
public:
    int user_id;
    int user_role;
    std::string user_name;
};


class conference_info
{
public:
    conference_info & operator = (const conference_info &conf)
    {   
        if (this != &conf){
            conf_id = conf.conf_id;
            dtsip_list = conf.dtsip_list;
            ctsip_list = conf.ctsip_list;
        }   

        return *this;
    }
public:
    int conf_id;
    std::list<std::string> dtsip_list;
    std::list<std::string> ctsip_list;
};

確定您可以(或不能)刪除共享對象的典型方法是使用引用計數-通過使用“共享指針”,或作為類本身中自己邏輯的一部分。 您將必須具有某種功能,客戶端代碼會使用該功能說“我要使用該對象”,這會增加引用計數。 客戶端完成后,它將調用“我不再對此對象感興趣”,並且引用計數將遞減。 如果引用計數變為零(並且由於其他原因不需要該對象),則可以將其刪除。

我建議在創建ClientEntity對象時,應確保它被另一個對象(例如全局對象)正確擁有,並且在銷毀全局對象時,請刪除ClientEntity

當然,您可以隨時在多個線程之間刪除ClientEntity ,但是當您嘗試刪除ClientEntity ,請使用關鍵部分之類的同步對象。

訪問ClientEntity其他線程也應使用關鍵部分等,以防止對象在使用時被刪除。

我使用了自己的類進行引用計數。 我進行了搜索,發現可以使用:

使用shared_ptr的例子?

http://www.boost.org/doc/libs/1_52_0/libs/smart_ptr/shared_ptr.htm

暫無
暫無

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

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