私は、構築時にバックグラウンドタスクを実行するクラスを持っています(コンストラクタ参照)。このタスクは、その後停止され、スレッドがオブジェクトが破棄されるデストラクタで参加している:C++ブーストスレッドは、二度インスタンス化されたときにセグメンテーションフォルトを引き起こします。
// Foo.hpp -------------------------------
#include <boost/thread.hpp>
#include <boost/date_time/posix_time.hpp>
class Foo {
boost::thread theThread;
Foo();
~Foo();
void bar() const;
}
// Foo.cpp -------------------------------
// This is the background task.
void Foo::bar() const {
while (true) {
try {
// sleep for 1 minute.
boost:this_thread_sleep(boost::posix_time::minutes(1));
// do other stuff endlessly
}
// boost interrupt was called, stop the main loop.
catch (const boost::thread_interrupted&)
{
break;
}
}
// Instantiate background task
Foo::Foo()
: theThread(&Foo::bar, this)
{
// do other stuff
}
// Stop background task
Foo::~Foo() {
theThread.interrupt()
theThread.join();
}
私はクラスに単一のインスタンスを持っている場合さて、これは正常に動作します:
// main.cpp
Foo f;
// do other stuff with f
しかし、私これを行うと、セグメンテーションフォルトと中止されたメッセージが表示されます。
// main.cpp
Foo *f;
f = new Foo(); // causes seg fault
delete f;
なぜですか?
が後押し:: thread'試みをし、コンストラクタの2番目のパラメータを間接参照し 'ない(あなたのケースでは、' this') ?もしそうなら、 'this'を初期化リストの引数として使うのは安全ではないようです。 – PaulMcKenzie
foo :: barがまだ構築されていないか確かにスレッド – didiz
残念ですが、あなたのコードはコンパイルされず、デストラクタはプライベートなのでmain.cppでこのクラスをインスタンス化できません。このコードがあなたの問題を再現していると確信していますか? –