2007年11月14日

スレッドプライオリティ

残念ながらプログラミング関連の話題が続きます。
スレッドプライオリティに関するあれこれ。

スレッド周りの仕様はOSごとに仕組みがバラバラで、マルチプラットフォームで動くプログラムを作る際に結構壁になる事があるらしい。
それをサポートするために ZThread や boost::thread 等があるようなのだが、実装をよく見てみるとスレッドプライオリティに関する設定項目が boost::thread にはないし、ZThread では OSX でのプライオリティ設定用コードが抜け落ちている。
wxWidgets の wxThread の実装は比較的しっかりしているようだったのでそのコードを参考にしつつスレッド優先度の指定方法について簡単に調べた範囲内でまとめてみた。

例えばオーディオ周りを扱うプログラムを書こうと思った場合、リアルタイムな処理を行う時にスレッド優先度を上げておくことは大切だと思うのでそういう場合に役に立つかと思い自分のためにまとめた。

Windows の場合:
優先度は THREAD_PRIORITY_LOWEST, THREAD_PRIORITY_BELOW_NORMAL, THREAD_PRIORITY_NORMAL, THREAD_PRIORITY_ABOVE_NORMAL, THREAD_PRIORITY_HIGHEST の中から選ぶ事ができ、SetThreadPriority を呼ぶ事で指定できる。

Mac の場合:
Carbon ではスレッド優先度が1から10000で選べ、MPSetTaskWeight を使うことで設定できるようだ。またここの文献を読む限りでは、MPSetTaskWeight は OS9 の頃から使えたようだ(ただし wxThread では Classic 用にはプライオリティを指定するコードは存在していない)。
OSX 以降で使える Cocoa では NSThread::SetThreadPriority で 0.0 〜 1.0 の範囲で指定できるらしい。また先ほどの文献に POSIX スレッドも利用可能と書いてある(POSIX スレッドに関しては後述)。

*nix 系の場合:
・Solaris
OS の仕組みもよくわかっていないので手の出しようがないのだが、wxThread ではプライオリティ変更周りの実装は空だった。thr_setprio や priocntl あたりが絡んでいるような情報は検索した限りではいくつか見つかったが具体的にどうすればいいのかはよくわからなかった。

・SGI
wxThread の実装は空。検索してもやはりよくわからなかった。

・POSIX
プライオリティ変更に対応している場合、生成前には pthread_attr_setschedparamで、生成後は pthread_setschedparam を使うことで指定できるようだ。
パラメータには sched_param 構造体のメンバ sched_priority に対して代入すればいいようだが、値の範囲は環境によって違うようで実行時に範囲を取得しなければならないらしい。

・OS/2
PRTYC_IDLETIME, PRTYC_REGULAR, PRTYC_TIMECRITICAL, PRTYC_FOREGROUNDSERVER の中から選ぶ事ができ、DosSetPriority を呼ぶ事で指定できるようだ(ただし wxThread のソースを見る限りでは OS/2 には SubPriority というのがあるようだ)。

PalmOS の場合:
優先度変更の概念がないっぽい…?
posted by oov at 10:20| Comment(0) | TrackBack(0) | プログラム | このブログの読者になる | 更新情報をチェックする
この記事へのコメント

この記事へのトラックバック
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。