[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 メーリングリストの案内