google-code-prettify

2008-10-22

ITRONのAPIは初心者に優しく、pthreadsのAPIは上級者に優しい

スレッド間(ITRONの用語では、タスク間)の通信を行う場合のITRONのAPIとpthreadsのAPIを比べると、
・ITRONの通信APIは、初心者に優しい
・pthreadsの通信APIは、上級者に優しい
と思う。

■ITRONとptheadsにはどんなAPIがあるか

ITRONのAPIには、多数の通信用の関数が用意されている。
・wai_sem()/sig_sem()
・set_flg()/wai_flg()
・snd_dtq()/rcv_dtq()
・snd_mbx()/rcv_mbx()
ITRONの拡張APIも含めると、
・loc_mtx()/unl_mtx()
・snd_mbf()/rcv_mbf()
・cal_por()/acp_por()

多数のAPIが用意されているため、ユーザーは用途に合ったAPIを選んで使う事になる。


一方、pthreadsでスレッド間の通信を行う場合、基本的には以下の4つのAPIを使う事になる。
・pthread_mutex_lock()/pthread_mutex_unlock()
・pthread_cond_signal()/pthread_cond_wait()
これらのAPIを使って、所望の通信機能を自分で作成する事になる。
例えばセマフォが欲しければ、これらの4つのAPIを使ってセマフォを実装する事になる。


■独自の通信APIを自分で実装できるかどうか

ITRONの場合は、自分で独自の通信APIを実装しようとした時に、かなり難しい事に気付く。
それは、
・ロックを解除する
・待ちに入る
を同時に(atomicに)実現する手段が、ITRONには用意されていないからだ。

ロックをしつつ、待ちに入る事ができないので、ITRONでは待ちに入る前には必ずロックを解除しなくてはならない。
wai_sem(lock_sem);
...
sig_sem(lock_sem);
/* ここで、他のスレッドにここで割り込まれるかも */
wai_sem(sleep_sem);

ロックの解除から待ちに入る間に他のスレッドにスイッチしてしまう可能性があるため、正しく動作するコードが書くのが非常に難しい。

逆に言うと、ITRONでは独自の通信APIを実装するのが難しいからこそ、多数の通信APIが最初から用意されているという見方もできる。


一方、pthradsのpthread_cond_wait()では、mutexのアンロックと待ちに入る事を同時に実現できる。
これにより、pthreadsでは独自の通信APIを作るのが非常に簡単である。

■結論

ITRONの通信APIは、多数の通信APIが最初から用意されているので、用途に合ったAPIが既にある場合には非常に楽。
一方、用途に合うAPIが無い場合は、非常に苦労する。

pthreadsの通信APIは、APIが少ないため、セマフォのような簡単に物でも自分で作らなくてはならない。
しかし、どんな通信APIでも実装が可能であるため、上級者にはこちらの方が使いやすい。

0 件のコメント: