我设计了一些课程。就像这样:
ClientEntity
可以有多个实例。ClientEntity
对象时,不会修改它,因此我不使用互斥锁。ClientEntity
个对象可以在不同的线程之间访问。ClientEntity
对象在收到一些退出命令时将被销毁。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;
};
答案 0 :(得分:1)
确定您可以(或不能)删除共享对象的典型方法是使用引用计数 - 通过使用“共享指针”,或者作为类本身逻辑的一部分。您将不得不使用客户端代码使用的某种功能来说“我想使用此对象”,这会增加引用计数。当客户端完成后,它会调用“我不再对此对象感兴趣”并且引用计数会倒计时。如果引用计数变为零(并且由于其他原因不需要该对象),则可以删除它。
答案 1 :(得分:0)
我建议在创建ClientEntity
对象时,确保它被另一个对象(比如一个全局对象)正确拥有,当全局对象被销毁时,删除ClientEntity
。
当然,您可以在多个线程之间随时删除ClientEntity
,但是当您尝试删除ClientEntity
时,请使用临界区等同步对象。
访问ClientEntity
的其他线程也应使用临界区等,以防止对象在使用时被删除。
答案 2 :(得分:0)
我使用了自己的类来引用计数。我进行了搜索,发现可以使用:
http://www.boost.org/doc/libs/1_52_0/libs/smart_ptr/shared_ptr.htm