На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела C/C++: Базы данных
Модераторы: B.V.
  
    > MySQL + мультипоточность , Нужно ли использовать mutex?
      Здравствуйте Всем!

      Имеется мультипоточное приложение под FreeBSD (сетевой сервер), из нескольких потоков идет постоянная работа с БД MySQL.

      В начале каждого потока (создаются через pthread_create()) я вызываю:

      ExpandedWrap disabled
        mysql_thread_init();


      Так вот вопрос к знатокам - насколько защищена реализация БД MySQL от мультипоточности, нужно ли самостоятельно следить за обращениями к её функциям?
      Просто на данные момент весь мой код нагромождён такими конструкциями:

      ExpandedWrap disabled
        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.

      Но все равно хотелось бы услышать комментарии знатоков :)
        Цитата postfx @
        Что затрудняет мне читаемость кода и т.д. + уже нашёл не одну ошибку, где срабатывают у меня по 2 раза lock, и соответственно, процесс виснет.

        Я бы посоветовал для таких вещей написать класс-обертку, который будет содержать все необходимые служебные вызовы, в том числе и защиту.
        Таким образом и глаз не будет замыливаться, и овцы целы.
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0228 ]   [ 16 queries used ]   [ Generated: 25.04.24, 14:32 GMT ]