У меня серьезные проблемы с mysql с помощью pthreads. Я получаю ошибку после окончания моей программы:Mysql в многопоточной программе - my_thread_global_end()
«Ошибка в my_thread_global_end(): 1 нить не выходила»
я назвал mysql_library_init в основном, прежде чем начать любые темы. Ради этого я только начал 1 нить. После того, как поток закрыт (используя pthread_join), я вызываю mysql_library_end в main. В самом pthread я вызываю mysql_init. По какой-то причине это кажется неправильной причиной, я получаю ошибку. Я использую MySQL 5.6 и связываюсь с libmysqlclient.a.
Руководство MySQL крайне неясно и противоречиво, так что я надеюсь, что кто-то с логическим мышлением может объяснить мне:
«В nonmulti нарезки среды, mysql_init вызывает mysql_library_init автоматически по мере необходимости, однако, mysql_library_init есть. не поточно-безопасный в многопоточной среде, и, следовательно, ни один из них не является mysql_init. Перед вызовом mysql_init либо вызовите mysql_library_init до появления любых потоков, либо используйте мьютекс для защиты вызова mysql_library_init. Это должно быть сделано до любой другой клиентской библиотеки вызов."
Первая строка: Так mysql_init ТОЛЬКО вызывает mysql_library_init в NONmulti-резьбовым среде «когда это необходимо» (если это необходимо в любом случае в NONmulti-резьбовым среде?), И поэтому я могу conlcude из этого, что mysql_init() считает, что это НЕ требуется в многопоточной среде? Наверное, нет, так хорошо, я называю mysql_library_init в моей основной ... Затем я читаю везде, где я должен также вызвать mysql_init в потоке. Я хочу, чтобы каждый поток имел свое собственное соединение, так что отлично, я также делаю так, чтобы каждый поток имел свою собственную структуру MYSQL. Но руководство саис mysql_init не Потокобезопасная ... Эмм, хорошо ... Так что с 1 нить, я все еще есть проблемы ...
main -> mysql_library_init
main -> create 1 pthread
pthread -> mysql_init
pthread -> mysql_real_connect
pthread -> mysql_close
....
жму Ctrl C через несколько секунд (MySQL был закрыто сейчас в потоке), так что чистка вверх начинает:
main -> pthread_cancel
main -> pthread_join
main -> mysql_library_end
РЕЗУЛЬТАТ: Ошибка в my_thread_global_end: 1 нити не выход
........
Я забыл упомянуть: поток все еще жив, когда я нажимаю Ctrl C, он блокирует семафор (для других целей) и прекратит блокировку, как только я нажму Ctrl C ... – Saskia
Нет, я не , существует ли эта команда? Не можете найти его в онлайн-руководстве. Если вы предпочитаете, чтобы я вставлял код, я сделаю это. – Saskia