RTS スレッドパッケージと MySQL の併用を試みたところ、以下の問題が発生しました。
これらのパッケージでは、多数の POSIX 呼び出しが使用されるほか、すべての関数のラッパを作成するのに非常に時間がかかります。そこで、スレッドライブラリを最新の POSIX 仕様に変更した方が簡単なのではないかと考えるようになりました。
一部のラッパは作成済みです。詳細については、mysys/my_pthread.c
を参照してください。
少なくとも以下を変更する必要があります。
pthread_get_specific
では 1
つの引数が使用されます。 sigwait
では 2 つの引数が使用されます。
多くの関数(少なくとも
pthread_cond_wait
、pthread_cond_timedwait
)
からエラー時にエラーコードが返される必要があります。ここでは
-1 が返され、errno
が設定されます。
もう 1
つの問題は、ユーザレベルのスレッドによって
ALRM
シグナルが使用され、そのために多くの関数(read
、write
、open
...)が中断されることです。
MySQL
では、中断されたすべての関数における割り込みに対して再試行する必要がありますが、確認するのは容易ではありません。
解決されていない最大の問題は以下のとおりです。
スレッドレベルのアラームを取得するため、mysys/thr_alarm.c
を変更し、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
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.