MySQL: Error in my_thread_global_end()

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Аватара пользователя
EmeraldMan
постоялец
Сообщения: 149
Зарегистрирован: 16.10.2008 08:41:51
Откуда: Белгород
Контактная информация:

MySQL: Error in my_thread_global_end()

Сообщение EmeraldMan »

Debian 64;
Lazarus 1.0.8, FPC 2.6.2;
MySQL 5.5.30;

Есть многопоточная консольная программа, каждый поток держит свое соединение с БД. Перед завершеним программы все Thread'ы закрывают соединения с базой, потоки уничтожаются, прога закрывается. И вот уже после закрытии программы через секунды 2-3 консоль выводит сообщение Error in my_thread_global_end(): 5 threads didn't exit (сколько потоков коннектилось к базе такая цифра и выводится). Причем если коннект происходил только от главного потока, то никакой ошибки не выводится.
До этого стоял Lazarus 1.0 (FPC 2.6.0), там использовал компоненты TMySQL51Connection (версия базы была MySQL та же 5.5, все корректно работало), после перехода на новую версию Lazarus поменял компоненты на TMySQL55Connection. До перехода данной проблемы не наблюдалось.

По ходу программы, потоки могут закрывать соединение, вновь открывать - все корректно происходит. Т.е. данная ошибка не критичная, никаких побочных эффектов от неё не замечал, но все же не приятно, что она выскакивает.

Подскажите, пожалуйста, решение данной проблемы.
Аватара пользователя
hinst
энтузиаст
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Сообщение hinst »

что за гавно. Почему я должен всё время трахаться с багами которые посадил не я; я застрелюсь скоро наверное
У меня такая же шляпа "threads didn't exit". И тоже с MySQL 55
Похоже что это MySQL-щики кривожопые баг посадили
Причём, у меня это происходит не только при выходе из программы, а вообще при нагрузке на чтение на БД
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

MariaDB так же себя ведет?
Аватара пользователя
hinst
энтузиаст
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Сообщение hinst »

Если кому интересно, проблемы с MySQL я "разобрал".
Во-первых, FPC по умолчанию использует потоко-небезопасную версию MySQL-клиента. Я попытался было создать баг: http://bugs.freepascal.org/view.php?id=25358 мне сказали, что ты можешь типа сам загрузить другую, потокобезопасную дин.библиотеку (в общем, по ссылке всё ясно объяснено).
Во-вторых, касательно конкретно Error in my_thread_global_end(): 5 threads didn't exit: нужно уничтожать подключение в том же потоке, в котором оно было создано и открыто. (насчёт открытия не уверен). Тогда ошибки не будет. При этом использовать его можно из любых потоков (у меня прокатило), если только они не будут использовать его параллельно (пока один использует, другие должны ждать)

Добавлено спустя 24 секунды:
Если есть вопросы конкретно по этому делу, пишите в эту тему или в личку
Аватара пользователя
Art!P
новенький
Сообщения: 27
Зарегистрирован: 28.07.2012 14:37:53
Контактная информация:

Сообщение Art!P »

У меня прога в потоках с MySQL работает, поток сам обрабатывает сигнал закрытия terminate, процесс ждет завершение операции, т.е. потоки завершаются как только становится возможным: закрываются соединения, синхронизируются данные с основным циклом программы.
Правда потоки у меня не динамические, их немного. Для каждого потока свой отдельный клиент подключения к БД, общих клиентов нет, в целом программа работает с 4-мя потоками, за месяц работы глюков не было (ОС линукс дебиан)
Аватара пользователя
EmeraldMan
постоялец
Сообщения: 149
Зарегистрирован: 16.10.2008 08:41:51
Откуда: Белгород
Контактная информация:

Сообщение EmeraldMan »

В uses модуля, где описаны потоки, прописал mysql55.
После соединения потока с базой добавил вызов процедуры my_thread_init, перед закрытием соединения вызов my_thread_end.
В принципе, работает и только с одной my_thread_end.

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