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/
2 名前:デフォルトの名無しさん mailto:sage [2006/09/10(日) 00:19:06 ] 関連スレ 【マルチコア】並列化について語る【使いこなせ】 pc8.2ch.net/test/read.cgi/tech/1137540671/ pthread地獄 (UNIX板) pc8.2ch.net/test/read.cgi/unix/1010933537/ 関連しやすいので一応 ネットワークプログラミング相談室 Port17 pc8.2ch.net/test/read.cgi/tech/1148944560/l50 書籍とかはもういいでしょ
3 名前:デフォルトの名無しさん mailto:sage [2006/09/10(日) 00:33:25 ] 乙
4 名前:デフォルトの名無しさん mailto:sage [2006/09/10(日) 15:04:22 ] 4ね
5 名前:デフォルトの名無しさん mailto:sage [2006/09/10(日) 16:03:40 ] 5免蒙る
6 名前:デフォルトの名無しさん mailto:sage [2006/09/11(月) 07:05:53 ] pthreadで排他制御やりたいときはmutexしか選択肢は無いんでしょうか?
7 名前:デフォルトの名無しさん mailto:sage [2006/09/11(月) 22:08:46 ] condition,semaphore
8 名前:デフォルトの名無しさん [2006/09/18(月) 01:43:12 ] 本とかはもういいとして、このソースのthread部分は秀逸だっていうの 教えてください
9 名前:デフォルトの名無しさん mailto:sage [2006/09/18(月) 09:25:39 ] apache2(ウソ)
10 名前:デフォルトの名無しさん mailto:sage [2006/09/18(月) 10:05:22 ] Windowsのスレッドのタイムスライスは、上限が20msと聞きますが これを制限する方法はありませんか? できれば、3〜5msに押さえたいのです。
11 名前:デフォルトの名無しさん mailto:sage [2006/09/18(月) 16:44:32 ] NT4.0を使って、boot.iniで設定。 Windows Embeddedならどっかで設定できたような。 Vistaは割り込み頻度を変えるAPIがあったかもしれず。
12 名前:デフォルトの名無しさん mailto:sage [2006/09/18(月) 20:34:42 ] Fiber使ってで明示的にスイッチするとか
13 名前:デフォルトの名無しさん mailto:sage [2006/09/18(月) 21:47:30 ] >>11 ありがとうございます。 こちらでも調べてみたのですが win9x/2000でのスレッド単位での設定は出来ないようですね。 スレッドスケジューラを少しいじれば、可変に出来る気がするのですが あんまり需要無いんですかね。 >>12 ファイバを使ってsuspendを置くか、スレッド関数にSleepを置くか、 結局のところ、これしかしかないのですね…… どちらか採用して、今のプロジェクトを進めようと思います。
14 名前:デフォルトの名無しさん mailto:sage [2006/09/19(火) 10:53:29 ] >>10 たしか、どっかにVistaのタイムスライスに関する blogがあったな。 ××をすると、スイッチが最小時間になると適らないとか。 どっかの、MVPの blogだったと思う。
15 名前:デフォルトの名無しさん mailto:sage [2006/09/19(火) 21:01:54 ] >>14 Vista+タイムスライスでググってみた。 ttp://d.hatena.ne.jp/NyaRuRu/searchdiary?word=*%5BVista%5D ついでに ttp://www.itmedia.co.jp/help/tips/windows/w0129.html
16 名前:デフォルトの名無しさん mailto:sage [2006/09/21(木) 21:28:56 ] InsideWindowsには [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\PriorityControl] のWin32PrioritySeparation をいじればいいと書いてある
17 名前:デフォルトの名無しさん mailto:sage [2006/09/21(木) 22:55:26 ] ってスレッド単位で制御したいのか そりゃ無理っぽいな
18 名前:デフォルトの名無しさん [2006/10/07(土) 12:26:02 ] ほ
19 名前:デフォルトの名無しさん [2006/10/10(火) 14:57:19 ] >>14 kernel修正すればいいじゃん。 2.6.xなら安定してるしNPTLを使えばOKだし
20 名前:デフォルトの名無しさん mailto:sage [2006/10/10(火) 21:20:44 ] ?
21 名前:デフォルトの名無しさん [2006/10/26(木) 16:02:30 ] マルチプロセスのプログラムはWindowsで作れますか?
22 名前:デフォルトの名無しさん mailto:sage [2006/10/26(木) 17:21:43 ] >>21 が意図してるものとは異なるかもしれんが、マルチプロセスのアプリケーションなら作れる。 しかし>>21 の質問の仕方からして、>>21 には到底無理だろう。
23 名前:デフォルトの名無しさん [2006/11/04(土) 17:13:38 ] 質問させてください。 Win32APIのSuspendThread()に自スレッドを指定して、 自分自身を眠らせるということは可能でしょうか?
24 名前:デフォルトの名無しさん mailto:sage [2006/11/04(土) 18:06:36 ] 試せばいいじゃん
25 名前:デフォルトの名無しさん mailto:sage [2006/11/04(土) 18:47:40 ] どうやって起こすの? イベントオブジェクト作ってWaitForしたほうがマシだと思うが・・・
26 名前:デフォルトの名無しさん mailto:sage [2006/11/04(土) 19:11:44 ] >>24 すいません、「可能」は「アリ」に置き換えてくださいorz 一応動くんですが、何かマズイんじゃないかなぁと思いまして。 >>25 仰るとおり実用的ではないですが、ちょっと気になったもので…
27 名前:デフォルトの名無しさん mailto:sage [2006/11/06(月) 15:24:05 ] >>23 他スレッドからResumeThreadしようとしたとき、Resumeしても SuspendThread の直前だったため Resume後即 Suspend してしまうケースがある。 → 解決するためには「スレッドのステート(idle,busyなど)」を設けて、 排他的に操作する必要あり。適切なイベントオブジェクトを使って待つ方が良い。 それでもまぁ他のスレッドを Suspend するのに比べればはるかに罪は少ない。
28 名前:デフォルトの名無しさん [2006/11/07(火) 09:09:31 ] 408 :名無しさん@お腹いっぱい。:2006/11/05(日) 18:14:14 Kentsfield(1P4C) vs Woodcrest(2P4C) www.hardwarezone.com/articles/view.php?id=2102&cid=2&pg=4 Opteronサーバー死んだな… Clovertown 1.60GHz $455*2 >>> Opteron 2220 SE $786*2 Clovertown 2.33GHz $851*2 >>> Opteron 8220 SE $2149*4
29 名前:デフォルトの名無しさん mailto:sage [2006/11/09(木) 22:08:24 ] 967 名前:923[sage] 投稿日:2006/09/09(土) 17:29:41 >>959 >intrinsicはスルーか。 済みません、仰りたいことの意味が良く分りませんでした。 このプログラムの要点は、 volatile long a = 0x00001111; void thread1(){ while(1)a=0x00001111; } void thread2(){ while(1)a=0x22220000; } int main(){ _beginthread(thread1); _beginthread(thread2); while(1)if(a != 0x00001111 && a != 0x22220000)エラー; return 0; } です。組み込み命令云々の余地があるのでしょうか? main, thread1, thread2が開始される。 〜〜〜時間が十分経過〜〜〜 thread2が動き出す。a=0x22220000が実行される。 mainが動き出す。a!=0x00001111の評価をする。真であった。 thread1が動き出す。a=0x00001111が実行される。 mainが動き出す。a!=22220000の評価をする。真であった。 mainが動き出す。エラー処理を行う・・・???。
30 名前:デフォルトの名無しさん mailto:sage [2006/11/10(金) 02:13:19 ] 複数のスレッドを起動する場合、 システムに異常が発生しても全てのスレッドを 必ずきちんと終了させたい場合、各スレッドで try catch 入れるんでしょうか? それとも別に良い常套手段があるんでしょうか?
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 ] だめだこりゃ