2012-02-23 14 views
1

私はRunnableクラスを持っています。次の関数では、新しいスレッドを開始するために使用します。boost :: threadセグメンテーションエラー

 start() 
     { 
      status_ = RUNNING; 
      mythread_ = boost::thread(boost::ref(*this)); // Line 2 
     } 

私はRunnableから派生したコントローラクラスを持っています。 と私は私が使用

、コントローラ内の機能を起動し、スタート()関数ので

を使用してコントローラのためのスレッドを作成したい:

controller_->start() 

新しいスレッドを作成します。

しかし、最終的にライン2.

で間違ってされている可能性がどのような任意のアイデアを、障害をセグメンテーションするためにつながりますか?

+0

'controller_'が有効なオブジェクトで、クラスに' operator()() 'があり、実際のコードに欠落している戻り値の型とセミコロンが含まれていると、何か問題はありません。 –

+0

コントローラが有効なポインタでない可能性があります – pezcode

答えて

0

スレッドライブラリをコンパイラに指定しないとsegfaultが発生することがあります。 unixを使用している場合は、-pthread引数をコンパイラに追加してみてください。しかし、それは最新のlinux/boost/gccではもう必要ないと思われます。

+0

ありがとうございますkynnysmatto、私はpthreadを含んでいます。私はこれを適切に解決できないと思います。私はどのように "この"コントローラクラスのリファレンスを開始メソッドで使用できますか? – user1228352

+0

私は分かりません。これは少なくとも私のコンピュータで動作します:[http://pastebin.com/LtfCnrBK](http://pastebin.com/LtfCnrBK) – kynnysmatto

+0

ありがとうございました。間違ったファイルが "boost/thread/thread.hpp"に含まれていましたが、 "boost/thread.hpp" – user1228352

0

オブジェクトのアドレスは、thisポインタのようにメンバ関数内からのみ使用でき、ほとんどの場合はthisが暗黙的に使用されます。

また、start()関数をクラスのfriendにして、オブジェクトの参照を新しいスレッドに直接送信することもできます。

関連する問題