[Armadillo:06667] Re: Armadillo-300 にて、タイマーと select を使うには?
TATENO Hiroyuki
email@hidden
2011年 1月 28日 (金) 11:23:12 JST
舘野です。
> 私なりに考えた方法として、pthread_createにて、
> スレッドを作成して、スレッドにてタイマの代わりを
> させようかと思ったのですが、
> 何か問題や気をつける点はありますでしょうか?
A300のカーネルは、たしか2.6.12でA200系と同じだと思いますので、
A220での経験から書かせていただきますと、スレッドがNPTLでは無く
LinuxThreadである、というのがクセモノです。
これは、プロセスに(カーネル内部で)細工をして、スレッドっぽく
振舞うものです。詳しくは、世の中に色々情報があると思いますので
調べていただくとしても、個人的意見としてはLinuxThreadならば
無理にスレッド使わずに別プロセスで処理しても、パフォーマンス的には
大して違わないのではないか、と思っております。
#なにしろ、元々プロセスですから。
> この場合、mainとスレッドが同じタイミングで、同じモジュールや
> メモリにアクセスした場合、どうなってしまうのでしょうか?
プログラムが予期しない動きをする事になります。
スレッドプログラムでは、「同期処理」が必須です。
例)
int flag = 1;
<thread1>
while (flag) {
if (/* 終了条件 */) {
flag = 0;
printf("終了するよ\n"); /* ←ここでthread2が動作したとしたら? */
} else {
/* 何かの処理 */
}
}
<thread2>
if (/* なにかの条件 */) {
flag = 1;
}
極端な例ですが、thread1でループ終了条件を満たして、ループを抜けようと
した時にthread2が別条件にてループ変数を書き換えたとすると、thread1では
ループを抜けようとしていたにも関わらず、ループを繰り返してしまう事に
なります。
特殊な例だと思われるかもしれませんが、マルチスレッドでは常に上記の
ような事が起こりえますし、しかもデバッグが難しくなかなか原因究明が
できない事になります。
> また、スレッド内では常時高速で動作出来るのでしょうか?
何をもって『高速』と書かれたのか分かりませんが、処理時間という事で
あれば、スレッドを生成した元スレッド(プロセス)と同等の処理時間が
与えられます。優先順位を変更する事で、より多くの処理時間をスレッドに
与える事もできますが、その分他のスレッド(プロセス)の処理時間が
減るのは自明です。
また、スレッド内にてブロッキングするシステムコールを呼び出せば、
そのスレッドは当然そこで処理が止まります。
I/O処理等が主にブロッキングします。
#non-blocking I/Oというのもありますが。
---
TETENO Hiroyuki
armadillo メーリングリストの案内