我有一个C++程序,该程序初始化MySQL数据库,然后用线程加载GUI,该线程一次访问数据库。

当我从主线程调用mysql_query()函数时,它可以正常工作,但是当我从新线程调用时,它会在段错误时崩溃。

这段代码工作正常(在主线程中调用了MySQL函数):

updateQueryEngines();

这段代码崩溃了(在不同的线程中调用了MySQL函数):
std::thread *my_thread = new std::thread(&MainWindow::updateQueryEngines, this);

任何的想法?

最佳答案

好的,我有一个答案,我认为将其发布在这里很重要,这样其他人就不会像我一样花一整天的时间。

当您启动一个新线程来访问mysqlt API的 MySQL C API 时,只需在该线程内调用API函数mysql_thread_init()即可。这将解决段错误问题:

void MainWindow::updateQueryEngines() {
    mysql_thread_init();

    ... rest of the code...
}

现在,我可以在新线程中调用此函数,而不会遇到段错误:
std::thread *my_thread = new std::thread(&MainWindow::updateQueryEngines, this);

10-06 05:00