Spec-Zone .ru
спецификации, руководства, описания, API

21.8.4.2. Запись C API Поточные Клиентские Программы

Клиентская библиотека почти ориентирована на многопотоковое исполнение. Самая большая проблема состоит в том что подпрограммы в net.c то чтение от сокетов не безопасно от прерывания. Это было сделано с мыслью, что Вы могли бы хотеть иметь свой собственный аварийный сигнал, который может повредить долгое чтение к серверу. Если Вы устанавливаете обработчиков прерываний для SIGPIPE прерывание, обработка сокета должна быть ориентирована на многопотоковое исполнение.

Избегать прерывать программу, когда соединение завершается, блоки MySQL SIGPIPE на первом звонке mysql_library_init(), mysql_init(), или mysql_connect(). Использовать Ваше собственное SIGPIPE обработчик, сначала вызовите mysql_library_init(), тогда установите свой обработчик.

Если "неопределенный символ" ошибки происходит, соединяясь против libmysqlclient клиентская библиотека, в большинстве случаев это - то, потому что Вы не включали библиотеки потока по команде ссылки/компиляции.

Клиентская библиотека ориентирована на многопотоковое исполнение для каждого подключения. Можно позволить двум потокам совместно использовать то же самое соединение со следующими протестами:

Вы должны знать следующий, если у Вас есть поток, который не создавал соединение с базой данных MySQL, но вызывает функции MySQL:

Когда Вы вызываете mysql_init(), MySQL создает специфичную для потока переменную для потока, который используется библиотекой отладки (между прочим). Если Вы вызываете функцию MySQL прежде, чем поток вызвал mysql_init(), у потока нет необходимых специфичных для потока переменных на месте, и Вы, вероятно, закончите с дампом ядра рано или поздно. Чтобы избежать проблем, следует сделать следующее:

  1. Вызвать mysql_library_init() перед любыми другими функциями MySQL. Это не ориентировано на многопотоковое исполнение, так вызовите это прежде, чем потоки будут созданы, или защитят вызов со взаимным исключением.

  2. Устроить mysql_thread_init() быть вызванным рано в обработчике потока прежде, чем вызвать любую функцию MySQL. Если Вы вызываете mysql_init(), это вызовет mysql_thread_init() для Вас.

  3. В потоке вызвать mysql_thread_end() перед вызовом pthread_exit(). Это освобождает память, используемую MySQL специфичные для потока переменные.

Предыдущие примечания относительно mysql_init() также применитесь к mysql_connect(), который вызывает mysql_init().