8 8 8 8 8 8 8 8 8 8 8 8 8 8
8
8
|
|
Замечания по потокам RTS - Программирование от RIN.RU
Замечания по потокам 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
8 8 8
| |
|
|