wxWidgets - 终止调用而没有活动异常(使用 std::thread)

wxWidgets - terminate called without an active exception (using std::thread)

本文关键字:使用 std 异常 thread 活动 终止 调用 wxWidgets      更新时间:2023-10-16

我正在编写GUI应用程序,该应用程序使用我自己的库,该库基于boost::asio C++11标准库。这是类gui_clientgui_client::OnInitgui_client::OnExit方法的实现,这些方法派生自wxApp

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

一切都编译完毕,应用程序启动。我在命令行中看到调试信息("返回 OnInit"(,然后:

终止调用而不显示活动异常

我尝试在某些wxApp函数上gdb设置断点,但找不到返回错误的位置。 gui_client类只有三种方法:

  • virtual bool OnInit()
  • virtual int OnExit()
  • client * get_client()

当我不启动阅读器线程(std::thread reader(时,一切正常。当我在lambda函数中启动带有空循环的线程时,我遇到了上面提到的错误。我也确定线程代码是正确的,因为相同的代码在 CLI 测试应用程序中运行良好。

我使用 wxWidgets 3.0.1.0g++ 4.7.2 (Debian(。我使用这个 g++ 命令进行编译:

g++ `wx-config --version=3.0 --cxxflags` -std=c++11 -I./headers -I../headers -L../lib/Debug -DDEBUG -g -c -o [obj_file] [source]

和这个用于链接的命令:

g++ `wx-config --version=3.0 --cxxflags` -std=c++11 -I./headers -I../headers -L../lib/Debug -DDEBUG -g [obj_files] -ltamandua `wx-config --version=3.0 --libs` -lboost_system -pthread -o [output]

问题就在这里:

std::thread reader([this]() {
    // thread code
});
reader_thread = &reader;

reader将在函数结束后销毁OnInit(并且将调用终止,因为thread是可连接的(。在这种情况下,您应该在类中使用智能指针,或者使用 new 创建reader_thread,或者只是将线程保存在对象中并通过移动将其分配给您的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);