17

std::shared_ptrと を使用してオブジェクトをジャグリングしようとしていますstd::weak_ptr。シナリオは次のようなものです。

channel抽象クラスから派生したクラスのオブジェクトがありますabstract::channel(純粋仮想関数を使用)。オブジェクトへの共有ポインタ ( ) を含むコンテナchannelContainer( ) があります。std::vectorstd::shared_ptrchannel

これで、内の各オブジェクトへのdeque (std::deque)ウィーク ポインターを含むができました。この両端キューに名前を付けましょう。(std::weak_ptr)channelContainerfreeChannelQueue

だから言いましょう:

std::vector<std::shared_ptr<abstract::channel> > channelContainer;
std::deque<std::weak_ptr<abstract::channel > > freeChannelQueue;

//Assuming that both the containers are filled appropriately How do I go about implementeing the below functions?

abstract::channel& get_free_channel() {
  //This should return a free channel object from 'freeChannelQueue' and pop the queue.
}

bool release_channel(abstract::channel& ch) {
 //This should convert 'ch' to a std::weak_ptr (or std::shared_ptr) and push it to   'freeChannelQueue'
}

「オブジェクトへの参照を弱いポインタに変換する方法は?」に特に興味があります。

4

3 に答える 3

1

これはあなたのデザインですか?現状では、チャネルの存続期間に重大な問題がいくつかあります。たとえば、コードが呼び出しget_free_channel()た場合、宣言はオブジェクトへの参照を返しますが、その有効期間がその使用を包含することを保証する方法はありません。関数を呼び出しているクライアント コードによっては問題にならない場合もありますが、次のように a を返したい場合がありますshared_ptr

std::shared_ptr<abstract::channel> get_free_channel()
{
    // return free channel from 'freeChannelQueue' and pop the queue

    // take a scoped lock on the free queue if necessary

    while (!freeChannelQueue.empty())
    {
         auto p_channel = freeChannelQueue.back();
         freeChannelQueue.pop_back();
         std::shared_ptr<abstract::channel> p = p_channel.lock();
         if (p) return p;
    }

    // freeChannelQueue empty... throw or return nullptr etc..
}

「リリース」について・・・

bool release_channel(abstract::channel& ch) {
 //This should convert 'ch' to a std::weak_ptr (or std::shared_ptr) and push it to   'freeChannelQueue'
}

現状では、これは を検索しchannelContainerてオブジェクトを見つけ、そこからweak_ptrまたはshared_ptrを取得する場合にのみ可能です。繰り返しますが、プロトタイプを変更してshared_ptrorweak_ptrを直接受け取り、フリー キューをロックしてからスマート ポインターをプッシュする必要があります。

全体として、チャネルの有効期間がどのように管理されるか、およびさまざまなスレッドがオブジェクトとキューをどのように使用しようとするかを理解せずに、有用なアドバイスを提供することは困難です。より正確な質問をする場合であっても、上記が少し役立つことを願っています。

于 2013-07-08T08:53:03.340 に答える
0

あなたの質問は次のように理解しています。すべてのチャネル オブジェクトを保持するコンテナがあり、アプリケーションで使用できるチャネルの順序を維持するための 2 つ目のコンテナがあります。次に、インターフェイスがクライアントの次の空きチャネルへの参照を返すようにし、クライアントが終了すると、チャネルを解放してコンテナに戻します。

チャネルへの参照を取得するには、lockを使用して、weak_ptr から shared_ptr を作成し、それを逆参照します (基になるオブジェクトを削除しないでください!)。ただし、他の方法に進むための賢明な方法はわかりません。チャネルコンテナーで一致するオブジェクトを検索し、一致する shared_ptr から弱いポインターを再度作成する必要があります。

私はweak_ptrと参照をまったく使用しないことを検討します.shared_ptrに固執してください. 使用可能なチャネルを維持するために両端キューを使用するため、代わりに使用可能な shared_ptr をそこに保持することができます。終了時にクライアントが常にチャネルを解放することに満足している場合、おそらくすべてのオブジェクトのコンテナーは必要なく、フリー チャネルの両端キューのみが必要です (全体的な設計によって異なります)。

他の人が言ったように、チャネル オブジェクトの有効期間とクライアントによる使用方法を考慮する必要があります。

于 2013-07-08T09:19:56.997 に答える