1

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

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

3 回答 3

1

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

于 2013-01-31T02:47:49.703 回答
0

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

使用 shared_ptr 的示例?

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

于 2013-01-31T03:02:14.337 回答
0

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

当然你可以ClientEntity在多个线程之间随时删除,但是当你试图删除时ClientEntity,使用像临界区这样的同步对象。

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

于 2013-01-31T02:54:55.883 回答