- 1 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/12/20(水) 22:11:47 ]
- Posixな糸に群がる亡者どものスレ。地獄の底でsage進行。
徳の高い人はpthread天国でも可。 ■前スレ pthread地獄 pc8.2ch.net/test/read.cgi/unix/1010933537/
- 130 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/25(金) 11:13:24 ]
- おれもわざわざそんな茨の道に行かなくてもと思う。
- 131 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/25(金) 11:44:36 ]
- そこまで苦労してまでバグを直接修正したくない理由の方に興味がわいてきた。
- 132 名前:93 mailto:sage [2008/07/25(金) 12:44:25 ]
- 今、気になっているのは、Webサーバの様なサーバプログラムで、ボスは常にaccept()待ち。
クライアントからの接続があったら、ワーカーを起動して、そのあとの処理はワーカに任せる。 といった、定番的なネットワークサーバを書く場合に、いわゆるfork()モデルと、スレッドモデルで どのような差があるのか(特にエラー発生時において)という事です。 なので、ワーカー側の処理ってのは、基本的に独立していてワーカー同士で共有を行うデータも 不要であると考えています。 非同期シグナルも使う必要は無いと考えています。(多分) fork()モデルの場合は、ワーカプロセスが同期シグナル(SIGSEGV,SIGILL等)を発生させたとしても、 他のワーカープロセスへの影響は特に無く、再度クライアントが接続してくれば、また、サービスを 再開することが出来ます。 スレッドモデルで同じことを実装することは可能なのか? 特定のワーカーが何らかの理由で同期シグナルを発生させた場合、その特定のワーカが死ぬのは しょうがないと思うんですが、他のワーカーまで道連れにしてしまうのは避けたいと思っています。 スレッドモデルを使ってこのような処理を安全に書けないって事は無いんじゃないのって思うんですが、 いかがなもんでしょう? また、MySQLはマルチスレッドで動いているらしいのですが、こういったDBサーバは更に複数のワーカ間で データの排他や同期を取る必要があると思うんですが、こういったプログラムは同期シグナルとどうやって 折り合いをつけているんでしょうか。 これがいわゆる茨の道ってやつですか?
- 133 名前:93 mailto:sage [2008/07/25(金) 12:52:01 ]
- >>131
まだ、なにも作ってないですよ。 pthreadというか、マルチスレッドのプログラムを作るのが始めてなので、 いろいろサンプルを作って勉強している最中です。 このスレとっても勉強になります。 レスしてくださっている皆さんありがと。 ところで、本屋行っても、pthread(マルチスレッド)に関する書籍ってほとんどないですよね。 あっても、10年ぐらい前に出版されたものが殆んどで。 この先、CPUはメニィコアに進もうとしているからもっと沢山あっても良いと思うんですが、 pthreadってあんまり使わないんですかね?
- 134 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/25(金) 12:57:45 ]
- > スレッドモデルで同じことを実装することは可能なのか?
想定しているのがSIGSEGVやSIGILLのようなプログラムロジックの バグである限り、不可能というのが答。 プロセスには、スレッドに比べて、メモリ空間が分離されていて SIGSEGVやSIGILLのような誤動作の影響を完全に排除できるという 特徴がある。つまり、まさにプロセスの利点に当てはまるケースな わけで、このような想定状況で、スレッドにプロセスと同等の信頼性 を求めることはできない。 > こういったプログラムは同期シグナルとどうやって折り合いをつけて > いるんでしょうか。 バグが原因で発生するシグナルは別として、sigwait() で対処するのが常識。
- 135 名前:93 mailto:sage [2008/07/25(金) 13:40:09 ]
- >>134
そっか。 やっぱりそうなんですか。 非同期シグナルであれば、シグナル受け専のスレッドを立てておいて、そこで sigwait()するってのは判るんですが、同期シグナルはsigwait()では待てないですもんね? ん?待てるのか? ちょっと試してみる。 でも、待てたとしても、どのスレッドがその同期シグナルを発生させたかって、シグナル受け専 スレッドで判らないけりゃどうしようもないですし。
- 136 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/26(土) 12:58:41 ]
- 悪いこといわねえだ。signal扱いたいならprocess村に帰った方がええ。
- 137 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/26(土) 17:23:08 ]
- つ libevent
- 138 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/26(土) 19:24:07 ]
- libevent はマルチスレッド環境でも安全に使う方法があるってだけで、
それ自体がスレッドセーフな作りになってるってわけじゃなかったはず。
- 139 名前:93 mailto:sage [2008/07/29(火) 10:32:25 ]
- とりあえず、やってみました。(Solaris10 x86です。)
ボス側で全てのシグナルをブロックし、シグナル受信専用スレッドを作成し、そこでsigwait()。 ワーカースレッドでSGISEGVを発生させるために、NULLアドレスに書き込み。 結果は、プロセスごと終了。 同期シグナルは発生元のスレッドに送られるのでシグナル受信専用スレッドでsigwait()していても 捕まえる事が出来ないってことですね。 同期シグナルは、ワーカースレッド側でsigset()して、シグナルハンドラ側でボスに >>125 すれば、 とりあえずハンドリングは出来ますが、 >>127 にもあるように、どこまで動くのかは不明ですね。 >>134 にもあるように、この辺りがマルチスレッドと、マルチプロセスの差という事なんですね。 そもそもスレッドってなに?、スタックとスレッドの関係って?、プロセスとスレッドの関係って? OSはスレッドをどう認識してるの? なんてことが判っている人にとっては自明なんでしょうが、私にもようやくこの辺りが判って来た 様な気がします。 なかなか使いどころが難しいですが、面白い仕組みですね。
- 140 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/30(水) 21:16:41 ]
- シグナルのことを考えるとunixでスレッドをモリモリ使うのはキツい。角度とか。
- 141 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/08/09(土) 19:15:44 ]
- あと、子プロセス生成(fork)も相性が悪くて、深い悲しみに包まれた。
- 142 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/08/09(土) 20:02:32 ]
- マルチスレッドプログラミング→排他漏れ続出→永遠とバグが取れない→いくえ不明
- 143 名前:名無しさん@お腹いっぱい。 [2008/08/09(土) 20:41:21 ]
- 俺はマルチプロセスを使い手なんだが相手が残念な事にスレッドを使ってきたので「お前それで良いのか?」と言うと「何いきなり話かけて来てるわけ?」と言われた。
俺の弟がスレッドの熟練者なのだがおれはいつも勝つから相手が気の毒になったので聞いただけなんだがむかついたので「お前シグナルでボコるわ・・」と 言ってmain直後に力を溜めてkillしたら多分リアルでビビったんだろうな、、pthread_sigmaskしてたからサスペンドしてカカッっとforkしながらkillしたらかなり青ざめてた おれは一気にlongjmpしたんだけどスレッドが硬直してておれの動きを見失ったのか動いてなかったからコマンド投下で排他を崩した上についげきのデッドロックでさらにダメージは加速した。 わざとセマフォをとり「俺はこのままタイムアウトでもいいんだが?」というとようやく必死な顔してなんかコードのはしっこからブロック型システムコール出してきた。 おれはselectで回避、これは一歩間違えるとカウンターで大ダメージを受ける隠し技なので後ろのギャラリーが拍手し出した。 俺は「うるさい、気が散る。一瞬の油断が命取り」というとギャラリーは黙った スレッドは必死にやってくるが、時既に時間切れ、スタックガードを固めた俺にスキはなかった たまに来るスタックガードでは防げない攻撃もexitで撃退、終わる頃にはズタズタにされたメモリ空間のcoreがいた
- 144 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/08/10(日) 03:35:51 ]
- MTは処理効率も応答性もいいのでプログラマからは良くたよりにされる
だがたよりにされたいからMTに分けてもダメだと言う事が最近わかった MTに分けるのは真にMTの問題だから処理を分けたくて分割するんじゃない 分かれてしまう処理がMT GUIはざんねんがはっきりいってmutexはつかわないしAPIもMT-unsafeとかイマイチだから信頼されにくい
- 145 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/08/15(金) 13:04:59 ]
- これ以上スレッドを作るなよ
プロセスはお前等のためにメモリ空間提供してやってるんだからな プロセスが終了すればすぐ死ぬくせに調子こき過ぎ あまり調子に乗ってると裏世界でひっそり幕を閉じる
- 146 名前:名無しさん@お腹いっぱい。 [2008/10/09(木) 04:28:39 ]
- hosyu
|

|