我正在编写使用我自己的库的GUI应用程序,该库基于boost::asio
C ++ 11标准库。这是gui_client::OnInit
的{{1}}和gui_client::OnExit
方法的实现,它们来自gui_client
:
wxApp
所有内容编译和应用程序启动。我在命令行中看到调试信息('返回OnInit')然后:
在没有活动异常的情况下终止被调用
我尝试在某些bool gui_client::OnInit()
{
io_service_ = new boost::asio::io_service;
client_ = new client(*io_service_);
frame = new main_frame();
std::thread reader([this]() {
// thread code
});
reader_thread = &reader;
frame->Show();
Debug("Returning OnInit");
return true;
}
int gui_client::OnExit()
{
reader_thread->join();
return 0;
}
函数的gdb
中设置断点,但我找不到返回错误的位置。 wxApp
类只有三种方法:
gui_client
virtual bool OnInit()
virtual int OnExit()
当我没有启动读者线程(client * get_client()
)时,一切都运行良好。当我在lambda函数中启动带空循环的线程时,我得到了上面提到的错误。我还确定线程代码是正确的,因为相同的代码在CLI测试应用程序中运行良好。
我使用std::thread reader
和wxWidgets 3.0.1.0
(Debian)。我使用这个g ++命令进行编译:
g++ 4.7.2
和此命令用于链接:
g++ `wx-config --version=3.0 --cxxflags` -std=c++11 -I./headers -I../headers -L../lib/Debug -DDEBUG -g -c -o [obj_file] [source]
答案 0 :(得分:1)
问题出在这里:
std::thread reader([this]() {
// thread code
});
reader_thread = &reader;
在reader
函数结束后, OnInit
将被销毁(并且将调用terminate,因为thread
是可连接的)。在这种情况下,您应该在类中使用智能指针,或者使用reader_thread
创建new
,或者只是将线程保存在对象中并将其分配给reader_thread
(reader_thread应该是对象,而不是指针)通过移动。
1)reader_thread = std::make_shared<std::thread>([this]() {});
2)reader_thread = new std::thread([this]() {});
3)
std::thread reader([this](){});
reader_thread = std::move(reader);