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. До перехода данной проблемы не наблюдалось.
По ходу программы, потоки могут закрывать соединение, вновь открывать - все корректно происходит. Т.е. данная ошибка не критичная, никаких побочных эффектов от неё не замечал, но все же не приятно, что она выскакивает.
Подскажите, пожалуйста, решение данной проблемы.
MySQL: Error in my_thread_global_end()
Модератор: Модераторы
- EmeraldMan
- постоялец
- Сообщения: 149
- Зарегистрирован: 16.10.2008 08:41:51
- Откуда: Белгород
- Контактная информация:
что за гавно. Почему я должен всё время трахаться с багами которые посадил не я; я застрелюсь скоро наверное
У меня такая же шляпа "threads didn't exit". И тоже с MySQL 55
Похоже что это MySQL-щики кривожопые баг посадили
Причём, у меня это происходит не только при выходе из программы, а вообще при нагрузке на чтение на БД
У меня такая же шляпа "threads didn't exit". И тоже с MySQL 55
Похоже что это MySQL-щики кривожопые баг посадили
Причём, у меня это происходит не только при выходе из программы, а вообще при нагрузке на чтение на БД
Если кому интересно, проблемы с MySQL я "разобрал".
Во-первых, FPC по умолчанию использует потоко-небезопасную версию MySQL-клиента. Я попытался было создать баг: http://bugs.freepascal.org/view.php?id=25358 мне сказали, что ты можешь типа сам загрузить другую, потокобезопасную дин.библиотеку (в общем, по ссылке всё ясно объяснено).
Во-вторых, касательно конкретно Error in my_thread_global_end(): 5 threads didn't exit: нужно уничтожать подключение в том же потоке, в котором оно было создано и открыто. (насчёт открытия не уверен). Тогда ошибки не будет. При этом использовать его можно из любых потоков (у меня прокатило), если только они не будут использовать его параллельно (пока один использует, другие должны ждать)
Добавлено спустя 24 секунды:
Если есть вопросы конкретно по этому делу, пишите в эту тему или в личку
Во-первых, FPC по умолчанию использует потоко-небезопасную версию MySQL-клиента. Я попытался было создать баг: http://bugs.freepascal.org/view.php?id=25358 мне сказали, что ты можешь типа сам загрузить другую, потокобезопасную дин.библиотеку (в общем, по ссылке всё ясно объяснено).
Во-вторых, касательно конкретно Error in my_thread_global_end(): 5 threads didn't exit: нужно уничтожать подключение в том же потоке, в котором оно было создано и открыто. (насчёт открытия не уверен). Тогда ошибки не будет. При этом использовать его можно из любых потоков (у меня прокатило), если только они не будут использовать его параллельно (пока один использует, другие должны ждать)
Добавлено спустя 24 секунды:
Если есть вопросы конкретно по этому делу, пишите в эту тему или в личку
У меня прога в потоках с MySQL работает, поток сам обрабатывает сигнал закрытия terminate, процесс ждет завершение операции, т.е. потоки завершаются как только становится возможным: закрываются соединения, синхронизируются данные с основным циклом программы.
Правда потоки у меня не динамические, их немного. Для каждого потока свой отдельный клиент подключения к БД, общих клиентов нет, в целом программа работает с 4-мя потоками, за месяц работы глюков не было (ОС линукс дебиан)
Правда потоки у меня не динамические, их немного. Для каждого потока свой отдельный клиент подключения к БД, общих клиентов нет, в целом программа работает с 4-мя потоками, за месяц работы глюков не было (ОС линукс дебиан)
- EmeraldMan
- постоялец
- Сообщения: 149
- Зарегистрирован: 16.10.2008 08:41:51
- Откуда: Белгород
- Контактная информация:
В uses модуля, где описаны потоки, прописал mysql55.
После соединения потока с базой добавил вызов процедуры my_thread_init, перед закрытием соединения вызов my_thread_end.
В принципе, работает и только с одной my_thread_end.
Ошибку выдавать перестал. Другие способы не помогали.
Повторюсь - ошибка была не критичная, все работало корректно, напрягал только сам факт её отображения в консоле после закрытия программы.
После соединения потока с базой добавил вызов процедуры my_thread_init, перед закрытием соединения вызов my_thread_end.
В принципе, работает и только с одной my_thread_end.
Ошибку выдавать перестал. Другие способы не помогали.
Повторюсь - ошибка была не критичная, все работало корректно, напрягал только сам факт её отображения в консоле после закрытия программы.
