先程のpthreadのエントリにもちょっと書いたが、何かを手っ取り早く勉強するには、
1. 基本を学ぶ。
2. FAQを読む。わからない点は調べる。
とするのが早いと思う。
例えば、C言語の場合なら、基本を理解した後に、C言語 FAQを読むのが良い。
google-code-prettify
2008-10-28
私のPthreadsの勉強方法
私がPthreadsを勉強した方法。この方法で、Pthreadsの初級者レベルは脱したと思う。
1. man ptheradを読む。
どんなAPIがあるのかを理解する。自分でthreadを作ったり、condとmutexを使ってみる。
2. POSIX Threads: Semi-FAQを読む。
わからない所はmanで調べる。
3. pthreads本を読む。

説明がまわりくどいが、役立つ情報がいろいろ書いてある。(特に後半)
4. pthreadsライブラリの実装を見る
私の場合は、NetBSDのsrc/lib/libpthreadのソースを読んだ。
NetBSDのpthreadのソースは読みやすかったが、Linuxのpthreadsのソースも読みやすいかはわからない。
あと役に立ちそうなサイト。
memologue
sig.txt
1. man ptheradを読む。
どんなAPIがあるのかを理解する。自分でthreadを作ったり、condとmutexを使ってみる。
2. POSIX Threads: Semi-FAQを読む。
わからない所はmanで調べる。
3. pthreads本を読む。

説明がまわりくどいが、役立つ情報がいろいろ書いてある。(特に後半)
4. pthreadsライブラリの実装を見る
私の場合は、NetBSDのsrc/lib/libpthreadのソースを読んだ。
NetBSDのpthreadのソースは読みやすかったが、Linuxのpthreadsのソースも読みやすいかはわからない。
あと役に立ちそうなサイト。
memologue
sig.txt
2008-10-22
ITRONのAPIは初心者に優しく、pthreadsのAPIは上級者に優しい
スレッド間(ITRONの用語では、タスク間)の通信を行う場合のITRONのAPIとpthreadsのAPIを比べると、
・ITRONの通信APIは、初心者に優しい
・pthreadsの通信APIは、上級者に優しい
と思う。
■ITRONとptheadsにはどんなAPIがあるか
ITRONのAPIには、多数の通信用の関数が用意されている。
多数のAPIが用意されているため、ユーザーは用途に合ったAPIを選んで使う事になる。
一方、pthreadsでスレッド間の通信を行う場合、基本的には以下の4つのAPIを使う事になる。
例えばセマフォが欲しければ、これらの4つのAPIを使ってセマフォを実装する事になる。
■独自の通信APIを自分で実装できるかどうか
ITRONの場合は、自分で独自の通信APIを実装しようとした時に、かなり難しい事に気付く。
それは、
・ロックを解除する
・待ちに入る
を同時に(atomicに)実現する手段が、ITRONには用意されていないからだ。
ロックをしつつ、待ちに入る事ができないので、ITRONでは待ちに入る前には必ずロックを解除しなくてはならない。
ロックの解除から待ちに入る間に他のスレッドにスイッチしてしまう可能性があるため、正しく動作するコードが書くのが非常に難しい。
逆に言うと、ITRONでは独自の通信APIを実装するのが難しいからこそ、多数の通信APIが最初から用意されているという見方もできる。
一方、pthradsのpthread_cond_wait()では、mutexのアンロックと待ちに入る事を同時に実現できる。
これにより、pthreadsでは独自の通信APIを作るのが非常に簡単である。
■結論
ITRONの通信APIは、多数の通信APIが最初から用意されているので、用途に合ったAPIが既にある場合には非常に楽。
一方、用途に合うAPIが無い場合は、非常に苦労する。
pthreadsの通信APIは、APIが少ないため、セマフォのような簡単に物でも自分で作らなくてはならない。
しかし、どんな通信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でも実装が可能であるため、上級者にはこちらの方が使いやすい。
2008-10-21
NetBSD4/currentのgdbで、info threadsが動作しない
NetBSD4とcurrentの、gdbでのpthreadサポートが動作しないようだ。
以下のプログラムをコンパイルする。
いくつかPRが出ているが、まだ修正されていない様子。
PR34194
PR35540
PR35657(これはclosed)
以下のプログラムをコンパイルする。
#include <stdio.h>
#include <pthread.h>
void *func(void *arg)
{
printf("hello\n");
sleep(10);
return 0;
}
int main(void)
{
pthread_t th;
pthread_create(&th, 0, func, 0);
pthread_join(th, 0);
return 0;
}
gdbでinfo threadsとしても、何も出力されない。(gdb) run
Starting program: /home/sakurai/tmp/pth/a.out
hello
^Z
Program received signal SIGTSTP, Stopped (user).
0xbbb17667 in sa_yield () from /usr/lib/libc.so.12
(gdb) info threads
(gdb) いくつかPRが出ているが、まだ修正されていない様子。
PR34194
PR35540
PR35657(これはclosed)
2008-10-03
thunderbirdでPGPする時に、UTF-8で送られてしまうのを回避する
Thunderbird + EnigmailでPGPメールを送ると、日本語メールでも必ずUTF-8で送られてしまう。
そうすると、UTF-8に対応していないメーラーで受信すると、メールが化けてしまう。
下記リンクの方法を使うと、UTF-8ではなくISO-2022-JPで送る事ができる。
bonbonniere - Enigmail 0.95.6での不具合の回避。
ちなみに私はEnigmail-0.95.7を使っているが、上記の方法で回避できた。
そうすると、UTF-8に対応していないメーラーで受信すると、メールが化けてしまう。
下記リンクの方法を使うと、UTF-8ではなくISO-2022-JPで送る事ができる。
bonbonniere - Enigmail 0.95.6での不具合の回避。
ちなみに私はEnigmail-0.95.7を使っているが、上記の方法で回避できた。
登録:
投稿 (Atom)