2010-01-15 119 views
4

我正在使用MySQL的c + +連接器(1.0.5),最近我將get_driver_instance()和connect()方法移動到輔助線程,然後我得到下面的錯誤。my_thread_global_end線程沒有退出,錯誤?

錯誤my_thread_global_end():1個線程沒有退出

谷歌上搜索之後我發現,MySQL的線程不會退出。有沒有在C++包裝的方法來清理?

回答

8

谷歌搜索後,我才知道()將解決問題。任何我連接到libmysqlclient.a的方式都包含mysql.h文件,並在退出輔助線程之前調用mysql_thread_end,現在問題已解決。

+0

哇!有同樣的錯誤。但爲什麼它會上升?有沒有「真實」或「正確」的方法來避免這種錯誤? – troyane 2013-04-03 20:04:55

+0

在我的書架中找不到此功能。我使用cppconn。這個功能在哪裏?謝謝。 – NoviceCai 2014-05-08 06:24:06

1

當使用C++ /連接器,這樣做相當於:

sql::Driver* driver = get_driver_instance(); 
    : 
    : 

driver->threadEnd(); // must be done or sql thread leaks on app exit with: 
         // Error in my_thread_global_end(): 1 threads didn't exit 
4

如果使用MySQL連接/ C++使用線程,你必須內sql::Driver::threadInit()sql::Driver::threadEnd()封裝你的mysql-一部分。

我發現了另一個類似的問題here

在你使用連接器的任何其他功能的線程裏面,你可以寫類似

sql::Driver *driver = get_driver_instance(); // should be synchronized 
driver->threadInit(); 

和線程停止過,但所有其他MySQL-的東西后,你可以寫somethink像

driver->threadEnd(); 

似乎get_driver_instance()不是線程安全的。如果我不同步,有時會出現段錯誤。在我的情況下,我在兩次測試中的大約一次初始化時出現了分段錯誤。由於我正在將呼叫同步到get_driver_instance(),因此我現在沒有分段錯誤。