Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.119.125.7] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте Всем!
Имеется мультипоточное приложение под FreeBSD (сетевой сервер), из нескольких потоков идет постоянная работа с БД MySQL. В начале каждого потока (создаются через pthread_create()) я вызываю: mysql_thread_init(); Так вот вопрос к знатокам - насколько защищена реализация БД MySQL от мультипоточности, нужно ли самостоятельно следить за обращениями к её функциям? Просто на данные момент весь мой код нагромождён такими конструкциями: pthread_mutex_lock(&mutex_mysql); mysql_query("update ......."); pthread_mutex_unlock(&mutex_mysql); Что затрудняет мне читаемость кода и т.д. + уже нашёл не одну ошибку, где срабатывают у меня по 2 раза lock, и соответственно, процесс виснет. Можно ли освободиться от самостоятельного использования mutex? Имеются ли в mysqllib средства работы с потоками? Спасибо. Добавлено Уже нашёл немного по этой теме, кому интересно, вот: http://www.rldp.ru/mysql/mysqldev/glava02.htm Самое главное: Вы можете позволять двум потокам совместно использовать то же самое подключение, пока Вы делаете следующее: - Два потока не могут посылать запрос 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. Но все равно хотелось бы услышать комментарии знатоков |
Сообщ.
#2
,
|
|
|
Цитата postfx @ Что затрудняет мне читаемость кода и т.д. + уже нашёл не одну ошибку, где срабатывают у меня по 2 раза lock, и соответственно, процесс виснет. Я бы посоветовал для таких вещей написать класс-обертку, который будет содержать все необходимые служебные вызовы, в том числе и защиту. Таким образом и глаз не будет замыливаться, и овцы целы. |