如何在多线程程序中安全地销毁共享对象?

时间:2013-01-31 02:38:13

标签: c++

我设计了一些课程。就像这样:

  1. 班级ClientEntity可以有多个实例。
  2. 创建ClientEntity对象时,不会修改它,因此我不使用互斥锁。
  3. ClientEntity个对象可以在不同的线程之间访问。
  4. ClientEntity对象在收到一些退出命令时将被销毁。
  5. 某些线程可能会访问
  6. ClientEntity个对象。
  7. 如何安全地销毁此对象?

    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;
    };
    

3 个答案:

答案 0 :(得分:1)

确定您可以(或不能)删除共享对象的典型方法是使用引用计数 - 通过使用“共享指针”,或者作为类本身逻辑的一部分。您将不得不使用客户端代码使用的某种功能来说“我想使用此对象”,这会增加引用计数。当客户端完成后,它会调用“我不再对此对象感兴趣”并且引用计数会倒计时。如果引用计数变为零(并且由于其他原因不需要该对象),则可以删除它。

答案 1 :(得分:0)

我建议在创建ClientEntity对象时,确保它被另一个对象(比如一个全局对象)正确拥有,当全局对象被销毁时,删除ClientEntity

当然,您可以在多个线程之间随时删除ClientEntity,但是当您尝试删除ClientEntity时,请使用临界区等同步对象。

访问ClientEntity的其他线程也应使用临界区等,以防止对象在使用时被删除。

答案 2 :(得分:0)

我使用了自己的类来引用计数。我进行了搜索,发现可以使用:

Example to use shared_ptr?

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