1 名前:デフォルトの名無しさん mailto:sage [2006/09/10(日) 00:13:53 ] マルチスレッドプログラミングについて語るスレ。 OS・言語・環境は問わないが、それゆえ明記すべし。 その1 pc3.2ch.net/tech/kako/997/997345868.html その2 pc5.2ch.net/test/read.cgi/tech/1037636153/ その3 pc8.2ch.net/test/read.cgi/tech/1098268137/ その4 pc8.2ch.net/test/read.cgi/tech/1130984585/
31 名前:デフォルトの名無しさん mailto:sage [2006/11/10(金) 06:01:09 ] システムに異常が発生した事を検知する関数が真を返したらすべてのスレッドが自主的に終了するようにしたらいいんちゃうん?
32 名前:デフォルトの名無しさん mailto:sage [2006/11/10(金) 08:53:37 ] ええんちゃう? 最高ちゃう?
33 名前:デフォルトの名無しさん [2006/11/10(金) 09:56:27 ] volatile最強伝説復活wwwwwwwwwwwwwww
34 名前:デフォルトの名無しさん mailto:sage [2006/11/10(金) 19:04:31 ] このスレも自主的に終了するようにしたらいいんちゃうん?
35 名前:デフォルトの名無しさん mailto:sage [2006/11/10(金) 20:51:25 ] ええんちゃう? 最高ちゃう?
36 名前:デフォルトの名無しさん mailto:sage [2006/11/10(金) 23:12:02 ] >>29 while(1)if(a != 0x00001111 && a != 0x22220000)エラー; を分解して while ( true ) { if ( a != 0x00001111 ) // a is 0x22220000 { if ( a != 0x22220000 ) // a is 0x00001111 { throw std::runtime_error("死んでしまえ"); } } }
37 名前:デフォルトの名無しさん mailto:sage [2006/11/17(金) 16:54:00 ] >>36 こうすりゃいいんじゃね? while(1){ int _a = a; if(_a != 0x00001111 && _a != 0x22220000)エラー; } 要は00001111か22220000以外が見つかればエラーにしたいんだから。 >>29 指摘のコンテキストスイッチによる嘘エラー検出は回避できる。
38 名前:デフォルトの名無しさん [2006/11/19(日) 14:18:42 ] 初心者です。 スレッドの状態(実行中・サスペンド中など)を知るAPIってありますか? State = ResumeThread( th_handle ) 又は State = SuspendThread( th_handle ) として サスペンドカウントを見て状態を更新させています。 状態を監視する別スレッドがこのStateを見て、レジューム・サスペンドの実行をおこなっているのですが、 どーやら、状態を監視するスレッドが見ているStateと実際の状態が異なるらしく、 レジューム中のスレッドにResumeThread を実行したり、サスペンド中のスレッドにSuspendThread を実行しちゃったりしています。 なにかアドバイスもらえませんか? おねがいします。 OS : Window XP Home 言語: C++ 環境: VC++6.0
39 名前:デフォルトの名無しさん mailto:sage [2006/11/19(日) 14:24:04 ] resume/suspendよりも、event objectやwindow messageを使って 眠らせることをオススメするよ。
40 名前:38 [2006/11/19(日) 14:35:34 ] >>39 アドバイス、ありがとうございます。 イベント使って、再設計してみます。 それと、色々さがしたんすけど、やっぱりスレッド状態を知るAPIとかは ないんすかね?
41 名前:デフォルトの名無しさん mailto:sage [2006/11/19(日) 14:39:09 ] 知ったところでどうしょうもない、とだけ言っておこう。 だからないのよ。
42 名前:38 [2006/11/19(日) 14:45:36 ] >>41 了解です。ありがとうございます。 助かります〜
43 名前:デフォルトの名無しさん mailto:sage [2006/11/19(日) 17:51:29 ] >>40 状態を調べたところでその次のステップで状態が変わってる可能性もあるわけで、 結局、排他やロックなどが必要になるわけです。 だったらはじめから>>39 の方法の方が妥当なのです。
44 名前:38 [2006/11/19(日) 23:36:56 ] 38です。 イベント使って再設計したとこ、なんとか思い通りに動いてくれました。 みなさん、どうもありがとう。 いい勉強になりました〜
45 名前:デフォルトの名無しさん mailto:sage [2006/11/20(月) 16:10:26 ] linux上のC言語での質問です。 pthread_create を使ってスレッドを生成すると、そのスレッドが完了しても 1個スレッドが残るんですが、これって開放出来ないんですか? デバッガで調べると「pthread_managear」というスレッドのようなのですが。
46 名前:デフォルトの名無しさん mailto:sage [2006/11/20(月) 20:40:45 ] >>45 スレッドマネージャもためらいきずばかりなんだよね 自殺はよくない
47 名前:デフォルトの名無しさん mailto:sage [2006/11/21(火) 01:19:01 ] どのlinux? それなくなったとか聞いたんだが
48 名前:デフォルトの名無しさん mailto:sage [2006/11/21(火) 09:28:07 ] >47 Red Hat Linux 7.3 です。
49 名前:デフォルトの名無しさん mailto:sage [2006/11/21(火) 19:20:58 ] pthread_joinしてないとかそういう話じゃないの?
50 名前:デフォルトの名無しさん mailto:sage [2006/11/22(水) 13:33:05 ] >49 joinはしてます。 あと 、pthread_detach も試して見ましたが変わらずでした。
51 名前:デフォルトの名無しさん mailto:sage [2006/11/23(木) 14:14:40 ] windows c言語です。 _beginthreadexでスレッドを数千つくろうとしてるのですが、 スレッド数400ぐらいこえたところで、_beginthreadが0を返しだすので仕方なくsleepいりのbusyloop で待って_beginthreadしつづけています。 スレッド数をタスクマネージャでながめると400になり、だんだんへって10桁程度になってから また400に跳ね上がるのくりかえしをして、正常に終了します。が遅いです。 だんだん減っているときにはすぐに次の_beginthreadが成功してくれて、 なぜ、400のままずっといき、最後がだんだん減っておわらないのかわからないです。 あと、なぜ400で限界になるのでしょうか? ちなみにスタックサイズをでかくするとスレッド数の限界はもっと減ります。 メモリがどんどんくわれていってスレッドももっとたくさんできて欲しいのですが・・・ スレッドの内容はメモリを動的確保しhtmlをネットから拾ってきて読むものです。 これだけでわかる人 ヒントください。
52 名前:デフォルトの名無しさん mailto:sage [2006/11/23(木) 14:19:52 ] >>51 www.biccamera.com/bicbic/jsp/w/pcoption/memory/0407/index.jsp
53 名前:デフォルトの名無しさん mailto:sage [2006/11/23(木) 15:12:17 ] >>52 え それはないと思う。 プロセスの使用メモリ35MBぐらいなんです。 全部で1Gつんでるのに。
54 名前:デフォルトの名無しさん mailto:sage [2006/11/23(木) 15:25:10 ] スタックメモリサイズの制限でしょ
55 名前:デフォルトの名無しさん mailto:sage [2006/11/23(木) 16:03:20 ] > スレッドの内容はメモリを動的確保しhtmlをネットから拾ってきて読むものです。 ジョブキューイングとかワーカスレッドとか知らんかね?
56 名前:デフォルトの名無しさん mailto:sage [2006/11/23(木) 17:00:57 ] 1プロセスにスレッド400個ってのは設計上どうなんだろ…。 タスクマネージャ見ても最高でSystemの78個程度だ。
57 名前:デフォルトの名無しさん mailto:sage [2006/11/23(木) 21:32:18 ] >>56 同意。 スレッドの生成と、管理にはそれなりのコストがかかるから、 むやみに増やしてもかえって遅くなる。 せいぜい数個から10数個くらいにとどめておくべきと思う。
58 名前:デフォルトの名無しさん mailto:sage [2006/11/23(木) 22:29:39 ] 数千スレッド使いたいってあほか。
59 名前:デフォルトの名無しさん mailto:sage [2006/11/23(木) 23:13:58 ] PCの玄海に挑戦したかっただけだろうよきっと
60 名前:デフォルトの名無しさん mailto:sage [2006/11/24(金) 01:00:08 ] どうもスレッドからみでは、本当に同時平行に処理したいことと、 そうでないことの区別ができてないことが多いようだ。
61 名前:デフォルトの名無しさん mailto:sage [2006/11/24(金) 01:07:32 ] この場合は ・ネットへのリクエスト ・得られた情報の分析 が並行処理対象になると思うんだが、 前者と後者ではやりかたがぜんぜん違うよなあ
62 名前:デフォルトの名無しさん mailto:sage [2006/11/24(金) 01:45:14 ] あまりのスケールのでかさに、別件でスレッドを使おうか迷っているのが バカらしくなってきた
63 名前:デフォルトの名無しさん mailto:sage [2006/11/24(金) 02:08:29 ] うちだと_beginthread()しまくるだけの奴で スレッド2000個ちょっとまで作れるな
64 名前:デフォルトの名無しさん mailto:sage [2006/11/24(金) 14:14:52 ] ふと>51の質問みて思ったんですが、スレッドを分ける(並列にする) と処理速度って上がるんでしょうか。 処理の内容によるでしょうけど、単純にCPU性能に依存するような 処理で、並列に処理可能な場合とか。 まあ普通そういう目的でマルチスレッドを利用したりするわけじゃないですが。
65 名前:デフォルトの名無しさん mailto:sage [2006/11/24(金) 14:15:53 ] ふと>51の質問みて思ったんですが、スレッドを分ける(並列にする) と処理速度って上がるんでしょうか。 処理の内容によるでしょうけど、単純にCPU性能に依存するような 処理で、直列に処理してたけど並列に処理可能な場合とか。 まあ普通そういう目的でマルチスレッドを利用したりするわけじゃないですが。
66 名前:デフォルトの名無しさん mailto:sage [2006/11/24(金) 14:16:56 ] 連書きスマソ;
67 名前:デフォルトの名無しさん mailto:sage [2006/11/24(金) 15:08:49 ] >>64 動作中スレッド数よりもCPUコア数が多いなら、スレッドを並列化することで高速化する。 仮に1Core1CPUで単純に並列化した場合、全く高速化しないかオーバーヘッドの分遅くなる。 まぁ、CPUコア数の数倍以上のスレッドを起こすと資源の競合が発生するから速くなる筈がない罠。
68 名前:デフォルトの名無しさん mailto:sage [2006/11/24(金) 16:02:59 ] >>67 CPUに限らず、資源が競合する処理なら、確かにそうなるな。 逆に言えば資源を競合しないI/Oウェイトなどが多い処理なら、 CPU数より極端に多いスレッド数でも処理は早くなるといえる。 たとえば今回のようなhtmlファイルのダウンロードの場合、 相手方のサーバーのレスポンス待ちが発生するので、複数のスレッドで別々の htmlファイルを同時に取得しにいったほうがいい。 ただ、やりすぎると今度はスレッド切り替えとか、メモリスワップとか、回線速度の限界とかで オーバーヘッドが大きくなるので遅くなる。
69 名前:デフォルトの名無しさん mailto:sage [2006/11/24(金) 16:05:55 ] tcpip.sysの同時接続制限とか関係ないのかな?
70 名前:デフォルトの名無しさん mailto:sage [2006/11/24(金) 18:03:54 ] >67 68 サンクス! 実はウチの作ってるアプリで性能を指摘されてるトコがあって、 並列化ってどうなんだろうと思ったんで、参考になりました。 とりあえずCPU依存の処理は効果薄って事ですね。
71 名前:デフォルトの名無しさん mailto:sage [2006/11/24(金) 19:12:42 ] >>70 並列化を考える前に、やることは色々あると思うよ。 CPUに、P4以上の制限つけていいならiccでコンパイルしてみるとか。 iccがあれば、並列化も簡単に試せるしね。 まぁ、詳細はスレ違いになるんで省略するけど。
72 名前:デフォルトの名無しさん mailto:sage [2006/11/25(土) 01:58:51 ] CPU依存の処理で高速化を考えるなら、並列化ではなくアルゴリズムの最適化を考えたほうがいい。 スパコンでもない限り、今のパソコンはせいぜい4コア。 並列処理させても、4倍未満にしかならない。 だけどうまくアルゴリズムを工夫すれば、数倍から数百倍の速度が稼げる可能性がある。
73 名前:デフォルトの名無しさん mailto:sage [2006/11/25(土) 02:07:56 ] DELLの6万円パソコン買ったほうがよくね? 10台でも60万。さてアナタの2人月より安い?高い?
74 名前:デフォルトの名無しさん mailto:sage [2006/11/25(土) 02:08:38 ] 無限に並列化可能な処理と仮定するなら、クラスタリングもありかと。 所謂グリッドコンピューティング。
75 名前:デフォルトの名無しさん mailto:sage [2006/11/25(土) 02:12:36 ] あと2倍になればいいだけなのにチューニングだとかほざいて 無駄にコードを複雑にしようとしていたボケがいたので サーバを3倍に増やして終わりにしました。
76 名前:デフォルトの名無しさん mailto:sage [2006/11/25(土) 02:53:01 ] ま、そこら辺は完全にケースバイケースだよね。お仕事でやってるならコスト次第。 このスレ的には並列度を上げる方向に収束すると美しいんだけど。
77 名前:デフォルトの名無しさん mailto:sage [2006/11/25(土) 03:05:17 ] そんな勝手に方向を決められても。
78 名前:デフォルトの名無しさん mailto:sage [2006/11/25(土) 12:57:34 ] >>71 >iccがあれば、並列化も簡単に試せるしね。 体感で速くなったためしがない。 いったいどういう場合に効果があるのか…。 人間が見ればすぐ分かるが、コンパイラの並列可能判定って どの程度のものなんだろう。
79 名前:デフォルトの名無しさん mailto:sage [2006/11/25(土) 12:58:54 ] ↑もちろん手動で並列化したら高速化できる状況での話ね。
80 名前:デフォルトの名無しさん mailto:sage [2006/11/25(土) 13:11:18 ] >>78 勿論、最低限-parallelは指定しているとして、単純なループなら並列化してくれる可能性はあるよ。 尤も、OpenMPを手軽に試せるという積もりで書いたんだけど。
81 名前:デフォルトの名無しさん mailto:sage [2006/11/30(木) 20:10:54 ] Sunコンパイラ最強伝説
82 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 20:35:28 ] 最近、コンパイラの最適化性能比較ってあんま情報ないな。
83 名前:デフォルトの名無しさん [2006/12/03(日) 21:51:02 ] すいません、マルチスレッドですか?
84 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 22:42:46 ] はい、マルチスレッドです。
85 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 23:28:53 ] あなたを、マルチスレッドです。
86 名前:デフォルトの名無しさん [2006/12/06(水) 23:09:42 ] 今日は徹夜でpthreadを勉強します。
87 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 01:09:39 ] こんやは徹夜で、マルチスレッドです。
88 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 11:08:50 ] それはいいマルチスレッドですね。
89 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 22:25:54 ] 俺はみんながマルチスレッドしたあとでいいよ
90 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 22:29:26 ] みんないっしょでこそマルチスレッドです
91 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 23:01:07 ] 俺ちょっと疲れたからみんな先にいってくれ
92 名前:デフォルトの名無しさん [2006/12/08(金) 03:40:09 ] 急激にスレの質が落ちて参りました
93 名前:デフォルトの名無しさん mailto:sage [2006/12/08(金) 14:50:27 ] みんなでマルチコスレッドしねぇ?
94 名前:デフォルトの名無しさん mailto:sage [2006/12/08(金) 21:05:24 ] JavaScriptの分際でマルチスレッドしてやがる事に最近気付いた。 仕組みどうなってんのよ?
95 名前:デフォルトの名無しさん mailto:sage [2006/12/08(金) 21:57:49 ] Javascriptなら中身見れるでしょーが
96 名前:デフォルトの名無しさん mailto:sage [2006/12/08(金) 22:03:46 ] ソースの問題じゃなくてCPUがどう処理をこなしているか知りたいんだよな
97 名前:デフォルトの名無しさん mailto:sage [2006/12/09(土) 00:36:36 ] 並行動作はせんと思うが
98 名前:デフォルトの名無しさん mailto:sage [2006/12/09(土) 00:59:15 ] CPU?
99 名前:デフォルトの名無しさん mailto:sage [2006/12/09(土) 01:01:50 ] onBlurとonClickで並列処理するよ。
100 名前:デフォルトの名無しさん mailto:sage [2006/12/09(土) 01:02:26 ] だめだこりゃ
101 名前:デフォルトの名無しさん mailto:sage [2006/12/09(土) 01:14:01 ] <script> function Test(){ while(1){} } </script> ... <span onclick="Test()">Hello World!</span> でブラウザ死ぬけど?
102 名前:デフォルトの名無しさん mailto:sage [2006/12/09(土) 01:18:19 ] ?
103 名前:デフォルトの名無しさん mailto:sage [2006/12/09(土) 01:28:07 ] どのブラウザで? つかブラウザネタをここでやるのか・・・ヤだなあ
104 名前:デフォルトの名無しさん mailto:sage [2006/12/09(土) 04:50:27 ] ここはやっぱり伝家の宝刀 volatileネタを持ち出して本来のスレの荒れ方に戻そうよ。
105 名前:デフォルトの名無しさん mailto:sage [2006/12/11(月) 10:38:50 ] Intel C++ Compiler for LinuxでOpenMPを使った並列化をやっているのですが、Intel Thread ProfilerにはLinux版が存在しないので、 暗黙的/明示的なバリア, ループの分割, critical構文等のオーバーヘッドや負荷の不均衡が検出出来ず、いまいちパフォーマンスが伸び悩んでおります。 このような問題を解決できるLinux用のツールは存在するのでしょうか? それともWindowsに移行するという選択肢しかないのでしょうか? なんだかレベルの低い質問で慙愧に堪えないのですが、もし誘導や解答をいただければ嬉しいです。 Intel Thread Profiler www.intel.com/cd/software/products/ijkk/jpn/threading/310854.htm
106 名前:デフォルトの名無しさん mailto:sage [2006/12/11(月) 18:47:00 ] 一昔前だったらまともなスレッドプログラミングしたけりゃSolaris使え、で 片付けられてたような気がするけど私も興味あるので識者の降臨を待つ。 Valgrind(Helgrinid)の他にLinuxで実用に耐えるツールはあるのかな、と。
107 名前:デフォルトの名無しさん mailto:sage [2006/12/11(月) 19:06:34 ] とりあえず脳味噌ぶら〜んから適当に検索。 ttp://www.nbrains.net/php/pukiwiki/index.php?link%BD%B8%2F%B3%AB%C8%AF%B4%C4%B6%AD%B7%CF#Debugger ttp://www.nbrains.net/php/pukiwiki/index.php?link%BD%B8%2F%B3%AB%C8%AF%CA%E4%BD%F5%A5%C4%A1%BC%A5%EB%B7%CF#Profiler
108 名前:105 mailto:sage [2006/12/11(月) 22:40:37 ] >>106-107 御解答有難う御座います。 わざわざ検索していただいたのに申し訳ないのですが、ちょっとその中には無いようですorz 凹んでいるだけでは何にもならないので、とりあえず"OpenMP"でググって片っ端から有望そうな所を覗いてみました。 結果、Omni OpenMP Compilerにtlogviewなるツールがあることがわかりました。 phase.hpcc.jp/Omni/openmp-tutorial/sld049.htm これを使えば、「iccでOpenMPを使った限界までのパフォーマンスチューニング」は難しそうですが、 「自分のコードの駄目なところ(計算粒度、ロードバランス等)を効率的に見つける」ことはできそうな感じです。 これを使って駄目だったらWinへの移行も検討してみようと思います。
109 名前:デフォルトの名無しさん mailto:sage [2006/12/11(月) 22:42:55 ] SolarisがN:Mスレッドモデルをやめたのは効率が悪かったから?
110 名前:デフォルトの名無しさん mailto:sage [2006/12/11(月) 23:45:55 ] アプリが1:1モデルを前提に作られる(チューンされる)ようになったから。 アプリといってもぶっちゃけoracleだが。 SolarisのためだけにN:M用チューンするのは時間の無駄だからね。 これを効率というならば効率だね。
111 名前:デフォルトの名無しさん mailto:sage [2006/12/20(水) 09:58:49 ] I/.O主体の仕事は前提とかチューンってこととは関係なく、 1:1の方が効率がいい場合が多いでしょ。 CPUを明け渡すのがカーネル内であることが多いから。 だからエンタープライズが主戦場のSolarisでは当然のことかと。
112 名前:デフォルトの名無しさん mailto:sage [2006/12/20(水) 10:23:41 ] OSが1:1ばかりになったというのもあるよ
113 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 01:18:13 ] そういうことは関係ない。 ちゃんと選んでやっている。
114 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 01:28:43 ] M:Nはシグナルの動きが1:1のときと全く同じにはならない。 両モードでのデバッグや検証コストを掛けられない。 もう一つは>>112 のとおり。 OS屋のオナニーで仕様が決まる時代は終わった。
115 名前:デフォルトの名無しさん mailto:sage [2006/12/22(金) 22:55:26 ] マルチスレッドのデバッグではまっています (私が作ったんじゃないのですが) beginthreadが50個、EnterCriticaSectionが40個くらい、 スレッド最大200個くらいが動くとんでもないシステムです。 (もちろん満足に動いてないです) とりあえず、下記の方針でソースをチェックしようと思いますが、 他にもありますでしょうか? 1 InitializeCriticalSection()以前の行に、_beginthreadを呼び出す関数に入ってないか 2 スタティック変数、グローバル変数にEnterCriticalSecitonなしで書き込みを 行ってないか 3 newで作ったオブジェクトのポインタを複数のスレッドで参照してないか
116 名前:デフォルトの名無しさん mailto:sage [2006/12/22(金) 23:13:58 ] >>115 問題を正しく特定できてるのか?
117 名前:デフォルトの名無しさん mailto:sage [2006/12/23(土) 00:10:24 ] >>116 とにかくアクセス違反で落ちたり、 const変数が書き換わったりするみたいです もちろんマルチスレッドが原因かは特定できないのですが、 (ただ、ソースを見ると明らかにマルチスレッドを扱いきれてないです) 今、メモリ周りとかいろんな方面から数人で見ています。 もちろんデバッガ使ったりログ吐いたりはしています。
118 名前:デフォルトの名無しさん mailto:sage [2006/12/23(土) 01:17:19 ] >>115 あと、EnterCriticalSectionへの再帰がないか。 同一スレッドだと、EnterCriticalSectionの挙動が変わるから注意。
119 名前:デフォルトの名無しさん mailto:sage [2006/12/23(土) 03:03:16 ] どれくらいのスパゲッティ度かにもよるけども 仮想的なdbを用意して、データへのアクセスは必ずdb経由にするのも手だぞ。 (ポインタは渡さない、必ず生データのやり取りにする) 少なくとも知らない間に書き換わることはなくなる。 パフォーマンスは落ちるけどな。
120 名前:デフォルトの名無しさん mailto:sage [2006/12/23(土) 09:02:59 ] >>118 なるほど、それは知りませんでした。ありがトン!!!!! >>119 うーん、なるほど。それも覚えておきます。ありがトン!!! とりあえず、ある程度安定してきたら、 再設計など検討するらしいです。
121 名前:デフォルトの名無しさん mailto:sage [2006/12/31(日) 12:29:32 ] winapiでいうところのCrateEvent(), WatiForSingleObject(), SetEvent(), ResetEvent() に該当する関数ってPOSIXでいうとどんなものになるんでしょうか? mutexは双方にあって別にいいんですが、待機オブジェクトがなくて困っています。
122 名前:デフォルトの名無しさん mailto:sage [2006/12/31(日) 13:24:29 ] >>121 condition
123 名前:デフォルトの名無しさん mailto:sage [2007/01/04(木) 21:52:54 ] 新年明けましておめでとうございます。 本年も、マルチスレッドプログラミング相談室 その5にご健勝あれ。
124 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 21:53:22 ] 本年の相談は終了いたしました。
125 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 23:09:40 ] >>123 うむ御旗楯無もご照覧あれ
126 名前:デフォルトの名無しさん [2007/01/08(月) 22:40:26 ] 実験用にものすごく単純なマルチスレッドの http サーバを組んでみたのだけど、 コードだけ見るとロックするようなコードじゃないのに、長時間ストップしたまま になることがある。(いちおう、しばらく待つと再開する) listen() 状態のソケット作って、accept() したら pthread_create() してループ。 子スレッドのほうでは GET (path) HTTP/1.1 を待って、そのファイルを読んで返すだけ。 という単純なやつなのだけど、毎秒100リクエスト以上くらい httperf で送ってやると、 必要以上に処理がストップする。 (netstat -a すると一つも ESTABLISHED になっていない状態で数秒間とまっている) カーネルは NUMA を無効にした以外は特にいじっていない Linux 2.6.15.7/x86_64 スレッドとネットワークをがんがんいじっている人には自明な問題っぽいけど、 どの辺に原因があって、どういじれば、せめて無駄なストップをしなくなるのでしょうか。
127 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 11:26:21 ] >>126 親スレッドでpthread_joinなり、pthread_detachしてる? してないと、終了コード保持のため、子スレッドが終了せず、プロセスのスレッド数限界に 引っかかるかもしれん。
128 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 17:27:41 ] いちいちaccept毎にthreadを作成・破棄というのが良くない予感
129 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 19:18:57 ] >>126 子スレッドはちゃんjとソケットから全部読んでから closeするか、shutdown するかしてますか?
130 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 21:36:43 ] FreeBSDでコンパイル&実行するとそういう問題は起きない
131 名前:デフォルトの名無しさん [2007/01/16(火) 22:08:14 ] _endthreadでスレッド終了すると、デストラクタが走りません。 無理やり{}で囲んでデストラクタを走らせてますが、 標準的な方法ってありますか?