2014-08-27 28 views
2

我有一個C++程序,它啓動一個MySQL數據庫,然後用線程加載GUI,一次只能訪問一次數據庫。MySQL C API:從不同線程運行查詢時出現分段錯誤

當我從主線程調用mysql_query()函數時,它運行良好,但是當我從一個新線程調用它時 - 它在分段錯誤上崩潰。

此代碼工作正常(MySQL的函數被調用在主線程):

updateQueryEngines(); 

此代碼崩潰(MySQL的功能在不同的線程中調用):

std::thread *my_thread = new std::thread(&MainWindow::updateQueryEngines, this); 

任何想法?

回答

0

好的,我有一個答案,我認爲在這裏發佈它很重要,所以其他人不會像我一樣花上一整天的時間。

當您啓動一個訪問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); 
+1

如果初始化函數帶有一個相應的「消滅」或「免費」功能,您應該在該功能結束時調用它。 – Brandon 2014-08-27 08:18:45