поиск:
Полезные ссылки

  • Форум по MySQL

  • Статьи по MySQL

  • Вопросы по MySQL

  • MySQL.com


  • Базы данных

  • MySQL

  • PostgreSQL


  • PHP конференция 2005
    Подробности!

    D.5. Замечания по потокам RTS

    При попытке применить пакеты потоков RTS с MySQL автору пришлось столкнуться со следующими проблемами:

    В этих пакетах используются старые версии большинства вызовов POSIX, поэтому очень утомительно создавать оболочки (wrapper) для всех функций. На мой взгляд, было бы легче изменить библиотеки этих потоков в соответствии с современной спецификацией POSIX.

    Некоторые оболочки уже написаны (чтобы получить более подробную информацию, обращайтесь к mysys/my_pthread.c).

    Следует изменить, по меньшей мере, следующие аспекты:

    В pthread_get_specific должен использоваться один аргумент, а в sigwait - два аргумента. Многие функции (по крайней мере, pthread_cond_wait, pthread_cond_timedwait) должны возвращать код ошибки или ошибку. Сейчас они возвращают -1 и устанавливают errno.

    Еще одна проблема заключается в том, что потоки пользовательского уровня используют сигнал ALRM, преждевременно прекращающий работу многих функций (read, write, open...). MySQL должен повторять попытку выполнить такие вызовы в случае прерывания, но это не так легко проверить.

    Наиболее значительная из нерешенных проблем заключается в следующем:

    Чтобы получать alarm на уровне потока, я изменил mysys/thr_alarm.c - чтобы ожидать alarm с помощью функции pthread_cond_timedwait(). Однако оказалось, что это приводит к преждевременному прекращению работы с ошибкой EINTR. Чтобы понять, почему так получается, я пытался отладить библиотеку потока, но не смог найти никакого простого решения.

    Для тех, кто хочет попробовать использовать MySQL с потоками RTS, я предлагаю следующее:

    • Измените функции, используемые MySQL из библиотеки потоков для POSIX. Это не должно занять много времени.

    • Скомпилируйте все библиотеки с -DHAVE_rts_threads.

    • Скомпилируйте thr_alarm.

    • Если существуют некоторые небольшие отличия в реализации, то они могут быть устранены изменением my_pthread.h и my_pthread.c.

    • Запустите thr_alarm. Если программа выполняется без каких-либо предупреждений, сообщений об ошибках или об аварийном выходе, значит, вы на правильном пути. Ниже приводится успешный прогон программы под Solaris:

      Main thread: 1
      Thread 0 (5) started
      Thread: 5  Waiting
      process_alarm
      Thread 1 (6) started
      Thread: 6  Waiting
      process_alarm
      process_alarm
      thread_alarm
      Thread: 6  Slept for 1 (1) sec
      Thread: 6  Waiting
      process_alarm
      process_alarm
      thread_alarm
      Thread: 6  Slept for 2 (2) sec
      Thread: 6  Simulation of no alarm needed
      Thread: 6  Slept for 0 (3) sec
      Thread: 6  Waiting
      process_alarm
      process_alarm
      thread_alarm
      Thread: 6  Slept for 4 (4) sec
      Thread: 6  Waiting
      process_alarm
      thread_alarm
      Thread: 5  Slept for 10 (10) sec
      Thread: 5  Waiting
      process_alarm
      process_alarm
      thread_alarm
      Thread: 6  Slept for 5 (5) sec
      Thread: 6  Waiting
      process_alarm
      process_alarm
      ...
      thread_alarm
      Thread: 5  Slept for 0 (1) sec
      end
      
     
    © 1997-2005 PHP Club Team
    Rambler's Top100