2010-01-15 1 views
4

Я использую MySQL C++ connector (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

Wow! Получена такая же ошибка. Но почему он поднимается? Есть ли «истинные» или «правильные» способы избежать этой ошибки? – troyane

+0

не удалось найти эту функцию в моей библиотеке. Я использую cppconn. где эта функция? Благодарю. – NoviceCai

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 Connector/C++ с потоками, вы должны инкапсулировать MySQL-часть в sql::Driver::threadInit() и sql::Driver::threadEnd().

Я нашел другой аналогичный вопрос here.

Перед тем, как использовать любую другую функцию соединителя внутри нити, вы можете написать что-то вроде

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

И до остановки резьбы, но после всех других MySQL-материала, вы можете написать somethink как

driver->threadEnd(); 

Также кажется, что get_driver_instance() не является потокобезопасным. Иногда я получаю ошибки сегментации, если я не синхронизирую его. В моем случае у меня была ошибка сегментации при инициализации примерно в одном из двух тестов. Поскольку я синхронизую вызов get_driver_instance(), у меня не было ошибки сегментации прямо сейчас.

Смежные вопросы