FLAGS

筆者おかあつ 大きな区分 記事の区分 記事の一覧 検索 ツイート

2009年7月14日火曜日

(プログラム)頭が重い (mixi05-u459989-200907140456)

ミクシ内で書かれた旧おかあつ日記を紹介します。
(プログラム)頭が重い
2009年07月14日04:56
風邪のせいか、シシャ(水タバコ)をすいすぎたせいか、頭が重い...。



今日考えたこと:

マルチスレッドプログラムというのは、実に難しいと思う。

Object lock1 = new Object();
Object lock2 = new Object();

void test1() {
synchronized( lock1 ) {
System.out.print( "a1" );
}
synchronized( lock2 ) {
System.out.print( "a2" );
}
}

void test2() {
synchronized( lock1 ) {
System.out.print( "b1" );
}
synchronized( lock2 ) {
System.out.print( "b2" );
}
}

このふたつのメソッドをそれぞれ別なスレッドで実行したとき、ありえる出力のパターンは何パターンあるだろう。

これははっきりいってムチャムチャ難しい問題だということに気がついた。

a1 b1 a2 b2 なんて素直な結果はめったに出ない。

a1 b1 a2 b2
a1 b1 b2 a2
a1 a2 b1 a2

b1 a1 b2 a2
b1 a1 a2 b2
b1 b2 a1 b2

かな。 たったこれだけなのにこんなに沢山のパターンが出てくる。
これがもし三つのスレッドを同時にやることになったら、どうなるだろう。
さらにnスレッドだとどうなるだろう。

僕にはまったく想像もつかない。
これを全て数え上げる機械的な方法があるだろうか。



これは要するにこういうことだ。

A・Bのふたつ部屋があります。 XさんとYさんのふたりの人がいます。 それぞれの人はまずAに入りZさんに電話をかけ、Bに入りZさんに電話をかけます。 ひとつの部屋にはひとりしか入る事は出来ません。 XさんとYさんは位置について、よーいどんで作業を開始します。

こういう実験をしたとき、Zさんが受け取る電話の順番はどういう順番になるでしょうか。

こういう問題だ。

気をつけないといけないことは多い。

- Xさんも Yさんも、常に全力で走るとは限らず、座ったまま2~3分休んでしまう事もある。
- XさんYさんのどちらが先に部屋Aに入るかは、競争だ。
- Zさんは一度に一人しか電話を受ける事が出来ない。
- またXさんが先にAに入ったとする。 XさんがAから出た後、YさんはAに入る。 XさんとYさんのどちらが先に電話がつながるかは、競争だ。

これを定式化するとどうなるだろう。

... わからない。

今日はもう、頭が痛いので寝よう。

コメント一覧
 
出展 2009年07月14日04:56 『(プログラム)頭が重い』