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 に答える