Boost.Thread に interrupt 機構は無い

Java の interrupt 機構みたいなのは Boost.Thread に無いみたいなんですね。


いろいろ調べてみた結果 interruptable_mutex.h というのが存在するということが分かったのですが、いまいち使い方が分かりません。
あとスペルは interruptable ではなくて interruptible ではないかと。interruptable でググってみると「もしかして: interruptible」とか言われてしまうので。


まあとりあえず interrupt 機構を実装してみるのは勉強にもなるので自分で実装してみようと頑張ってみます。


今のところ脳内の設計では、

  • interruptible_condition なるクラスを作る
  • interruptible_condition は static な TSS を持っている
  • TSS には interrupt 状態が入っている
  • interruptible_condition の wait や timed_wait の実装は、TSS 内の interrupt 状態を見て例外を投げたりするようにする
  • interrupt するときには引数に thread* を取るようにする(そうじゃないとどのスレッドを interrupt するのか分からないので)
  • interrupt の中で interrupt 状態を変化させて、notify_all によって wait しているスレッドを起こしてやる
  • notify_all によって起きたけど、interrupt の時に指定された thread* が自分のスレッドじゃなければ再び wait する。
    • interrupt の時に指定された thread* が自分のスレッドだった場合は、例外を投げる。

こんな感じ。
抜けが大量にありそうで怖い。


追記:
自分の能力ではかなり厳しいっぽいことが分かったので一時保留ということで。
Two-Phase Termination はぐるぐる回しながら待つことにするかな……。


追記2:
boost 1.35.0 以降からは interrupt 機構が入ってるのでこの問題は解決。