Два потока не могут посылать
Два потока не могут посылать запрос MySQL в то же самое время на том же самом подключении. В частности Вы должны гарантировать, что между mysql_query() и mysql_store_result() другой поток никогда не использует то же самое подключение. Несколько потоков могут обращаться к различным наборам результатов, которые получены через mysql_store_result(). Если Вы используете mysql_use_result, Вы должны гарантировать, что никакой другой поток не спрашивает что-нибудь относительно того же самого подключения, пока набор результатов не закрыт. Если Вы хотите использовать много потоков на том же самом подключении, Вы должны иметь блокировку mutex вокруг Вашей комбинации вызовов mysql_query() и mysql_store_result(). Когда mysql_store_result() готов, блокировка может быть снята, и другие потоки смогут сделать запрос с того же самого подключения. Если Вы программируете с потоками в стиле POSIX, Вы можете использовать pthread_mutex_lock() и pthread_mutex_unlock(), чтобы устанавливать и снимать блокировку mutex.
Вы должны знать следующее, если Вы имеете поток, который вызывает функции MySQL, но не создал подключение к базе данных MySQL:
Когда Вы вызываете mysql_init() или mysql_connect(), MySQL создаст специфические переменные для потока, которые используются библиотекой отладки.
Если Вы имеете в потоке вызов функции MySQL прежде, чем поток вызвал mysql_init() или mysql_connect(), поток не будет иметь необходимых специфических переменных, и Вы, вероятно, свалите программу в дамп рано или поздно (скорее рано, чем поздно). Чтобы работать спокойно, надо предпринять следующее:
Вызовите my_init() в начале Вашей программы, если она вызывает любую другую функцию MySQL, перед вызовом mysql_real_connect(). Вызовите mysql_thread_init() в драйвере потока перед вызовом любой функции MySQL. В потоке вызовите mysql_thread_end() перед вызовом pthread_exit(). Это освободит память, используемую специфическими переменными MySQL.
Вы можете получать некоторые ошибки из-за неопределенных символов при компоновке Вашего клиента с mysqlclient_r. В большинстве случаев это потому, что Вы не включили библиотеки потоков в строку компоновки.
Содержание раздела