2011-01-21 9 views
2

私のコードではboost::threadsを使用し、fnThread()というメンバ関数を介してスレッドを実行するクラスを持っています。このfnThread()では、shared_from_this()を作成し、リスニングパーティーにシグナルで渡したいと思います。しかし、行boost::shared_ptr<foo> p = shared_from_this()は次のように例外をスローします。他のスレッド(メンバースレッド関数)のshared_from_this()

boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_weak_ptr> > at memory location 0x04c2f720. 

違反コマンドはshared_from_this()です。別のスレッドからshared_from_this()を作成するのは違法ですか?何か間違っていますか?どんな助けもありがとうございます。ありがとう!

PS:自分の構造に影響を与えないので、シグナルの引数をプレーンポインタに変更する予定です。しかし、私はshared_ptr <を好んでおり、その決定に関するコメントを聞きたいと思っています。この特定の状況に対してはおそらくそれは悪い選択です。何を指示してるんですか ?

EDIT:あなたは

class foo : public boost::enable_shared_from_this<foo> 
{ 
public: 
    int start() 
    { 
     foo_thread.reset(new boost::thread(boost::bind(&foo::fn_foo_thread, this))); 

     return 0; 
    } 

    ~foo() 
    { 
     if (foo_thread->joinable()) 
      foo_thread->join(); 
    } 

private: 
    boost::scoped_ptr<boost::thread> foo_thread; 

    void fn_foo_thread() 
    { 
     boost::shared_ptr<foo> p = shared_from_this(); 
     std::cout << "foo thread terminated. \n" << std::endl; 
    } 
}; 
+0

「あなたはshared_from_this()を作成しますか?」とはどういう意味ですか? –

+0

私は 'boost :: shared_ptr 'を' this 'にすることを意味します – fgungor

+1

' foo'をインスタンス化し、 'start'を呼び出すコードを示してください。間違いはおそらくそこにあります。 – Macke

答えて

0

をテストするためにここで

はあなたがboost::intrusive_ptr<>boost::shared_ptr<>を変更することを検討するようなことがあり、単純なクラスです。主な違いは、boost::intrusive_ptr<>は、参照カウンタがオブジェクト内に格納されていることを示しています(他の場所に格納することは可能ですが)。埋め込み参照カウンターを使用すると、コンストラクターまたはプレーンポインタからboost::intrusive_ptr<>を作成することができます(ただし、デストラクタでboost::intrusive_ptr<>を使用しないでください)。

4

shared_from_thisは、別のスレッドから使​​用できます。 shared_ptrthis(名前が示すとおり)が存在しない場合は、bad_weak_ptr例外がスローされます。ほとんどの場合、問題はコードの他の場所に存在します。

+0

複数のスレッドから同時にオブジェクトの 'shared_from_this'を呼び出すのはどうですか? – updogliu

+1

'shared_from_this'はスレッドセーフです。 –

2

@Sam Millerが既に述べたように、この問題は他の場所にも存在します。 fooscoped_ptr<foo>と宣言したと思います。このようにするとshared_from_thisが有効な共有ポインタを返すことは不可能です。boost::scoped_ptrタイプのスマートポインタはオブジェクトの所有権を譲渡できないためです。あなたの例外の理由はここにあります。

0

shared_from_this()コンストラクタが終了する前、またはデストラクタが開始される前に呼び出すことはできません。

関連する問題