2

マルチスレッド アプリケーションで、自動接続管理でブースト シグナル 2 を使用したいと考えています。私のクラスはから継承してenable_shared_from_this<>おり、別のメンバー メソッド内からメンバー メソッドを接続したいと考えています。接続は頻繁に再構築される可能性があるため、コードは可能な限り高速にする必要があります (ブースト signal2 のパフォーマンス自体にもかかわらず):

typedef boost::signals2::signal<void ()> signal_type;

struct Cat : public enable_shared_from_this<Cat>
{
  void meow ();

  void connect (signal_type& s)
  {
    // can't write this
    s.connect (signal_type::slot_type (&Cat::meow, this, _1).track (weak_from_this ()));

    // ok, but slow?! two temporary smart pointers
    weak_ptr<Cat> const myself (shared_from_this ());
    s.connect (signal_type::slot_type (&Cat::meow, this, _1).track (myself));
  }

  // i am missing something like this in the base class
  // protected:
  //   weak_ptr<Cat> const& weak_from_this ();
};

私の設計目標が矛盾している可能性があることは知っていますが(自動接続管理とスレッドセーフだけでなく、高速コードも)、とにかく:

  1. enable_shared_from_this<>組み込みへの直接アクセスが欠けているのはなぜweak_ptr<>ですか? 反対する理由が見当たりません。私のようなユースケースはありませんか?

  2. 上記よりも速い回避策はありますか?

編集:

私はこのように考えられることを知っていますが、追加のストレージ/初期化チェックのペナルティを避けたいです:

template <typename T>
struct enable_weak_from_this : public enable_shared_from_this<T>
{
protected:
  weak_ptr<T> /* const& */ weak_from_this ()
  {
    if (mWeakFromThis.expired ())
    {
      mWeakFromThis = this->shared_from_this ();
    }

    return mWeakFromThis;
  }

private:
  weak_ptr<T> mWeakFromThis;
};
4

2 に答える 2

-1

インスタンスをshared_ptr参照していないことが原因である可能性があります。には少なくとも 1 つのアクティブな が必要です。Catweak_ptrshared_ptr

shared_ptrメンバー変数として配置し、connectメソッドで最初に割り当ててみてください。

typedef boost::signals2::signal<void ()> signal_type;

struct Cat : public enable_shared_from_this<Cat>
{
  void meow ();
  boost::shared_ptr<Cat> test;

  void connect (signal_type& s)
  {
    test = shared_from_this();
    s.connect (signal_type::slot_type (&Cat::meow, this, _1).track (weak_from_this ()));
  }
};

しかし、基本的に、存在しないweak_ptr場合は存在しませんshared_ptr。また、がまだ使用されている間にすべてがshared_ptr消えた場合、 は存在しないオブジェクトを指している可能性があります。weak_ptrweak_ptr

注: 私のテストは、オブジェクトの割り当てが解除されないため、実稼働コードでは使用しないでください。

于 2013-04-10T15:00:58.170 に答える