C ++ boost线程在实例化两次时会导致分段错误

时间:2017-05-04 15:08:47

标签: c++ multithreading boost

我有一个在构造后运行后台任务的类(参见构造函数)。然后停止此任务,并在销毁对象时将线程连接到析构函数中:

// 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;

为什么呢?

1 个答案:

答案 0 :(得分:0)

Xcode给出错误:

  

尝试使用已删除的功能

Foo :: Bar不能使用上面的语法(&amp; Foo :: Bar)调用,因为它不是静态函数。它有一个隐藏的参数,导致签名不匹配。

更多相关信息: pthread function from a class

在初始化程序列表中使用成员函数也是不好的做法,行为未定义。引用这里:

  

可以调用成员函数(包括虚拟成员函数)   来自成员初始值设定项,但如果不是全部,则行为未定义   直接碱基在那时被初始化。

http://en.cppreference.com/w/cpp/language/initializer_list

以下作品:

   void bar(atomic_int*exit) {
    while (*exit) {
        // sleep for 1 minute.
        this_thread::sleep_for(std::chrono::seconds(2));

        // do other stuff endlessly

    }
}

class Foo {
    thread theThread;
    atomic_int _exit;

public:
   // Instantiate background task
    Foo(): _exit(1)
    {
        // do other stuff
        init();
    }
    void init()
    {
        theThread = std::thread (&bar,&_exit);
    }

    // Stop background task
    ~Foo() {
        _exit = 0;
        theThread.join();
    }
};