我有一个在构造后运行后台任务的类(参见构造函数)。然后停止此任务,并在销毁对象时将线程连接到析构函数中:
// 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;
为什么呢?
答案 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();
}
};