我曾尝试让MySQL使用RTS线程软件包,但是在下面的问题上遇到阻碍:
RTS线程软件包很多老版本的POSIX调用,对所有函数的写封装就很枯燥。我倾向于认为把线程库换成最新的POSIX规格,会更容易些。。
一些封装正在编写中。更多信息请参阅mysys/my_pthread.c 文件。
至少下面说道的应该改变一下:
pthread_get_specific该使用一个参量。 sigwait应该使用两个参量。很多函数(至少pthread_cond_wait, pthread_cond_timedwait())应该返回错误的错误代码。现在它们返回 -1 且设置 errno。
另一个问题是,用户级线程使用ALRM信号,这会终止很多函数(read, write, open...)。MySQL应该重试一下所有这上面的中断,但是这并非很容易去验证。
最大的未解决问题如下:
要获得线程级警报,我使用pthread_cond_timedwait()改变 mysys/thr_alarm.c,让它在警报之间等待。但是它发生EINTR错误,终止了。我试着调试线程库找出为什么会出这个错误,但是找不到一个简便 的解决办法。
如果人人想要用RTS线程跑一下MySQL,我建议以下几点:
把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