E. 移植到其他系统 / E.4. 关于RTS线程的注释

E.4. 关于RTS线程的注释

我曾尝试让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