- 1 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 19:26:16 ]
- マルチスレッドプログラミングについて語るスレ
■前スレ マルチスレッドプログラミング相談室 その6 ttp://pc11.2ch.net/test/read.cgi/tech/1187008532/ ■過去スレ その1 ttp://pc3.2ch.net/tech/kako/997/997345868.html その2 ttp://pc5.2ch.net/test/read.cgi/tech/1037636153/ その3 ttp://pc8.2ch.net/test/read.cgi/tech/1098268137/ その4 ttp://pc8.2ch.net/test/read.cgi/tech/1130984585/ その5 ttp://pc11.2ch.net/test/read.cgi/tech/1157814833/ OS・言語・環境は問わないが、それゆえ明記すべし。 テンプレ 【OS】 【言語】 【実行環境】 【その他突起する事項】
- 175 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 00:36:35 ]
- >>170
スレッドを192個作る。 各スレッドのaffinityを設定して、CPUに貼り付ける。 特定のスレッドのセットをビジーループにして、タスクマネージャに文字を出す。
- 176 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 00:47:04 ]
- >>175
> 特定のスレッドのセットをビジーループにして、タスクマネージャに文字を出す。 ビルのイルミネーションみたいでいいね!
- 177 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 09:57:17 ]
- winで1プロセスに64コア以上ってどうやるんだっけか
- 178 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 20:48:06 ]
- >>177
>Windows 7/Windows Server 2008 R2 では 64 論理 CPU をひとつの "グループ" と定義し, >プロセスは初期状態で "グループ" のどれかに束縛されている(どのグループに属するかはラウンドロビンで決定される). >そして,新しく定義された API で明示的に許可を与えない限り,プロセス内のスレッドは >所属 "グループ" の CPU でのみ実行される. >つまり,新しい CPU グループ制御 API を使用しない限り,ひとつのプロセスは高々 64 個の >プロセッサしか活用しない. ttp://d.hatena.ne.jp/NyaRuRu/20081107/p1
- 179 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 11:06:48 ]
- 窓7が主流になる頃には64コアCPUとか出てるって事?
凄いな
- 180 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 11:14:12 ]
- マルチCPU
- 181 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 11:30:11 ]
- 8コア*8CPUでやっと64
4CPUのマザーは見たことあるけど…
- 182 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 13:20:57 ]
- ブレードにすればよかろう。
- 183 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 22:01:52 ]
- コンシューマ向けの話じゃないのか
- 184 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 00:25:44 ]
- て言うか、ブレードってブレード毎にOSが載ると思うが。
8ブレードとかを1つのOSで制御できる奴なんてあるのか?
- 185 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 00:37:32 ]
- >>184
www.hitachi.co.jp/products/bladesymphony/product/bs1000.html インテル Itanium プロセッサー搭載サーバブレードでは、バックプレーンの 高速インターコネクトを介し最大4枚のサーバブレードをSMP接続することで、 最大8プロセッサ(16コア)のSMPサーバーとしても利用可能。 h50146.www5.hp.com/products/servers/nonstop/hardware/NB50000c/index.html 最新のデュアルコア インテル Itanium プロセッサ(9100シリーズ)を最大4,080個搭載可能
- 186 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 07:36:32 ]
- >>185
これ買おうかな やっぱ自宅警備にはこれくらいのマシンがないとな
- 187 名前:デフォルトの名無しさん [2008/11/20(木) 17:32:02 ]
- int i;
for( i=0; i<10; i++ ) { h = CreateThread ( NULL, 0, (LPTHREAD_START_ROUTINE)DoIt, NULL, 0, &id ); } void WINAPI DoIt() { // ここでいろいろ } のようにして同じ関数を複数のスレッドで行いたいのですが ここでいろいろのところに制御がいかず すぐにスレッドが終了するのですが 同じ関数をスレッドで実行することはできないのでしょうか? WindowsXP C/C++ Win32API
- 188 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 17:47:14 ]
- >>187
まず先に突っ込んでおくが、LPTHREAD_START_ROUTINEと 合わない関数をキャストで無理矢理渡すな。 DoIt()がLPTHREAD_START_ROUTINEに適合する関数なら キャストなんて必要ない。 すぐにスレッドが終了するってのは、どうやって確認した? CreateThreadを呼んだメインスレッドは、各スレッドが仕事を 終えるまで待機している? そもそもDoIt()がすぐに終了する内容じゃないの?
- 189 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 18:09:42 ]
- >>188
すいません 処理の流れがつかめてませんでした 解決しました
- 190 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 18:18:19 ]
- 便乗して質問ですが
WindowsXP Home Edition にて作成するスレッド数の上限はありますか?
- 191 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 18:26:58 ]
- msdn.microsoft.com/ja-jp/library/cc429080.aspx
> 1 つのプロセスが作成できるスレッドの数は、利用可能な仮想メモリによって制限されます。 > 既定では、各スレッドに 1MB のスタック空間が割り当てられています。 > そのため、最大 2,028 個のスレッドを作成できます。
- 192 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 19:35:05 ]
- マルチもいいけど 実行ファイルが自分で空いてるCPU選ぶようにしたい
Windows側でプロセス作成時に勝手にやってるとありがたい
- 193 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 21:55:25 ]
- 意味がわからん。
スレッドはあいているCPUでしか実行出来ないし。 ひょっとして、自分のプロセス専用にCPUが 割り振られて欲しいって話か?
- 194 名前:デフォルトの名無しさん [2008/11/21(金) 10:58:32 ]
- Sleep関数について質問ですが
MSDNによると VOID Sleep( DWORD dwMilliseconds // 中断の時間 ); とありますが マイナスの値を代入した時の挙動はどうなるのでしょうか? 実際ためしてみたのですが、永遠制御が返ってきません
- 195 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 11:34:10 ]
- DWORDは符号なしの型だからマイナス値を取れないと思うが
- 196 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 11:39:26 ]
- >>195
なるほど しかし、VC++6.0 では怒られないんですよ 2ch.homelinux.com/2d/32/src/1227235104677.jpg
- 197 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 11:41:30 ]
- VC6はゴミということで
- 198 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 11:44:17 ]
- まぁそりゃ暗黙に型変換されてるんだろう
警告なしにそういった型変換をするのはCの悪いところ というか警告レベルを上げましょう
- 199 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 12:49:10 ]
- マルチスレッド対応で60FPSを維持する方法ってどうやるんですか?
- 200 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 12:59:59 ]
- ぇ?w
垂直同期とか
- 201 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 13:57:29 ]
- >>196
49.7日待てば目覚めるはず
- 202 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 14:03:23 ]
- えいえんは、あるよ
49.7日ぐらい
- 203 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 19:43:02 ]
- >>197
Cの仕様なのに何言ってんだ。
- 204 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 19:58:03 ]
- Cはゴミということで
- 205 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 00:28:22 ]
- >196
まず警告レベルを上げろ。
- 206 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 10:52:51 ]
- >>205
警告レベル4にしたら STLのライブラリのソースでwarnningが・・・ MS君・・・
- 207 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 22:06:38 ]
- STL で warning はよくあること。
まあ気にすんな。 鬱陶しければ #pragma warning(disable: XXXX) で消して 後で #pragma warning(default: XXXX) で復活させれば良い。
- 208 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 03:09:31 ]
- CreateThreadでクラスのメンバ関数って渡せますか?
- 209 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 03:21:05 ]
- なんとなく自己解決しました
- 210 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 16:46:25 ]
- test
- 211 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 19:47:00 ]
- >>201
INFINITE = 0xFFFFFFFF = (DWORD)-1
- 212 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 21:46:58 ]
- >>211
あーそうなんだー
- 213 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 00:26:53 ]
- P2Pや分散メモリに適した高速
ロックってどんなのがあるのですか?
- 214 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 00:43:43 ]
- とりあえず知ってる言葉を並べてみました。
- 215 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 07:57:29 ]
- >>213
高速なパッセージならやっぱ3大ギタリスト、とくにベックじゃね? ルカサーも捨てがたいが 若いのは知らん
- 216 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 11:30:25 ]
- やっぱりクリティカルなセクションをアトミックに相互排他する場合
レスポンスタイムが長いメモリをダイレクトにアクセスするのは非効率だから トランザクショナルメモリみたいな遅延する仕組みがマストニードじゃないですかね
- 217 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 13:11:00 ]
- 日本語でおk
- 218 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 13:27:51 ]
- やっぱり際どい領域を原子的に相互排他する場合
反応時間が長い記憶装置を直接読み書きするのは非効率だから トランザクショナルメモリみたいな遅延する仕組みがどうしても必要じゃないですかね トランザクショナルメモリだけはどうにもならんかった。
- 219 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 13:37:44 ]
- 「処理単位記憶装置」かな?
- 220 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 14:44:45 ]
- 都覧公国量産型六番書鳴記憶
- 221 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 20:55:12 ]
- ザクメモリってどうやってつくるの?
アルゴリズム全然解らん
- 222 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 21:45:47 ]
- 弱そうなメモリだな
- 223 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 21:51:07 ]
- トラングフショナルメモリ
- 224 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 21:51:07 ]
- トランザクショナルメモリって
どんなアルゴリズムなのですかね? 何処探してもみつからない
- 225 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 22:02:31 ]
- ロックフリーあたりで調べればいいと思う
でもコストが大きい気がするのでリードライトロック程度で十分かと
- 226 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 22:14:10 ]
- リードライトロックの中にもフェアかフェアじゃないかで変わるけどね。
オブジェクト指向はハードウェアの都合までは吸収してくれんよなぁ。 マルチスレッドのデザパタ見ててそう思う。
- 227 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 22:44:09 ]
- 排他制御書き込みって
pthread_rwlockで実現できますか?
- 228 名前:デフォルトの名無しさん mailto:sage [2008/12/03(水) 00:04:59 ]
- 素直にmutexつかっとけ
読み書き両方な
- 229 名前:デフォルトの名無しさん mailto:sage [2008/12/03(水) 00:17:05 ]
- >228
排他制御書き込み実現しようとすると pthread_mutexでは、try_lockを全mutex分 毎回ぶん回すってことでおkなのかな? この辺の定石ってよくわからん
- 230 名前:デフォルトの名無しさん mailto:sage [2008/12/03(水) 03:01:55 ]
- mutexが複数あるの?
どういう排他制御をしたいのかわからん
- 231 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 15:29:07 ]
- スレッド2000個作って
画像データダウンロードするやつ作ったんだけど スレッドが全部同時に動作しないんだ どこがいけないんだ?
- 232 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 15:42:50 ]
- 当てずっぽうだけどサーバが2000接続も同時に処理できないんじゃね
1個ずつ順番に処理して残りは待たされてるとか
- 233 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 15:53:38 ]
- そもそも2000スレッドが同時に動くはずがない。
- 234 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 15:58:58 ]
- 1000コア*2(HT)ですね
もしそんなのがあったとしても現状Linuxしか動かせない
- 235 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 16:25:36 ]
- 「全部同時に」ってのがどの程度の同時性を指してるんでしょうね
- 236 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 18:00:38 ]
- Sunのやつなら動くと思うよ
- 237 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 19:34:10 ]
- どの程度とかの精度の問題ではないんですよ
動けばいいだけのレベルなんですけど for ループ内で約2000 個のスレッド作るんで、 タイミング的にはほぼ同時な気がしますが OSにもよるかもしれませんが、 そうそう10秒以上も差が出るとは思えないんで 精度は10秒以内くらいの超おおざっぱでいいですけど 動かないんですよ ちなみにCUI コマンドプロンプトで多数のスレッドから printf されるとやはり多重に出力され hogehogehogehoge が hohohogegegehoge になったりするんでしょうか?
- 238 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 19:34:15 ]
- 環境は?
win32じゃなさそうだが
- 239 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 19:45:36 ]
- Erlangなら60000スレッドぐらい起せるよ
- 240 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 19:54:33 ]
- >>237
標準出力はバッファリングされるので、混ざる場合はバッファサイズずつ混ざる。 >237のように1バイトずつ混ざることはない。
- 241 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 22:34:02 ]
- >>237
動かないってどう動かないんだよ。
- 242 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 22:45:56 ]
- >>238
機密事項なので書けません><
- 243 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 23:39:13 ]
- おれも1万個ぐらい動かしてるけど別に問題ないな。
機密事項だから環境は書けないが。
- 244 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 23:53:58 ]
- >スレッド2000個作って画像データダウンロードする
あほのすることだな
- 245 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 05:05:46 ]
- >>244
ネットワークモニタの使用率が25%超えたことないんで 限界までいどみたかったとです
- 246 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 05:36:11 ]
- >>245
自分で対向サーバを用意すれば簡単だよ。
- 247 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 06:44:22 ]
- スレッドって関係あるん?
- 248 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 07:44:39 ]
- >>247
deteike
- 249 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 10:16:03 ]
- 2000個もスレッド作ってりゃオーバーヘッド大きすぎてそりゃ限界までいかんわな。
っていうかそもそもネットワークモニタって実効速度の%出してくれるんだっけ??
- 250 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 11:04:38 ]
- >>249
タスクマネージャにあるよ OSの限界ギリギリまで性能を出そうとしたのに なんてOSだ・・・
- 251 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 11:48:23 ]
- 馬鹿は巣にお帰りください。
- 252 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 15:04:34 ]
- だからなんでスレッドにすると帯域使用量が上がるんだっけ?
でっかいファイル一つを read するのと、スレッド2000個で read するので 差が出る理由はなに?
- 253 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 15:06:38 ]
- ネットワークの話じゃなかったのか。
- 254 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 15:19:33 ]
- ああ、そういうことね
1スレッドひとつにつき1つの画像をダウンロードするプログラムを組んだ このスレッドを2000個同時に実行したけど 2000個同時(プログラム的には)には動作してくれなかった ということ
- 255 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 15:47:41 ]
- だから、2000ポート空けて待つような対向サーバを自前で用意しろって。
- 256 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 16:10:56 ]
- >>252
思い込み
- 257 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 16:25:13 ]
- >>250
だからさあ、例えばギガビットイーサだったら100%って1Gbpsじゃないの? 実効速度250Mps出てても25%だぜ?
- 258 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 20:02:19 ]
- バス速度的に実際1Gbpsなんて無理
100Base-TXで考えなさい
- 259 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 20:07:35 ]
- FPGAのNICなら1Gっていったら1G出ますが?
- 260 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 20:08:02 ]
- うん
馬鹿は帰れ
- 261 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 20:11:23 ]
- >>254
そもそも、シングルコア、1スレッドあたりのタイムスライスを10msとすると、 1周するのに単純計算で10ms×2,000=20,000ms=20秒だ。実際には10msよりも もっと長いのが普通(※1)だし、スレッド切り替えにもコストがかかる(※2)し、 マルチコアとしてもコア数分の1にしかならない上に、コア間の調停にも やっぱりコストがかかる(※3)。 あと、ネットワークの実効速度についても、デカいパケットが順番に流れる なら、かなり帯域上限に近付けることができるが、細かいパケットが非同期に 衝突しまくりながら流れるようだと、いいとこ1/3くらいしか出ない。 ぶっちゃけ、アプローチが間違ってるとしか思えん。 ※1:ぐぐってみたところ、Windowsについてはこんなんが引っかかった。 ttp://itpro.nikkeibp.co.jp/article/COLUMN/20080602/305755/?ST=develop&P=3 もっと良い資料やUNIXについての言及があれば教えてくれ。 ※2:レジスタ等のコンテキスト情報を全部保存してパイプラインを捨てて 他スレッドのコンテキストを読み込む。キャッシュから溢れてたら最悪 メインメモリまで取りに行くハメになるぞ。 ※3:各コアが互いに読み書きできるレイヤまでデータが届く必要があるため。
- 262 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 20:37:21 ]
- たしか一般に、CPUサイクルで見て、
スレッド作成が数万〜10万サイクル(ひょっとすると数十万〜だったかも)、 コンテキストスイッチが数千〜1万サイクル とか見た気がする。
- 263 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 20:38:37 ]
- おっと、スレッドに関わるオーバーヘッドの話ね。
- 264 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 01:15:52 ]
- >>262
>コンテキストスイッチが数千〜1万サイクル 今時LinuxでもO(1)スケジューラなわけだが。
- 265 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 01:22:44 ]
- そりゃ的外れなレスなこって
- 266 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 01:48:56 ]
- ワロタ
- 267 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 09:39:27 ]
- WindowsとかLinuxとか・・・
そんな貧乏臭いOSの話ばっかでワロタ
- 268 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 10:27:54 ]
- そうですか
- 269 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 13:48:37 ]
- アセンブラ級はついていけn
- 270 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 18:58:28 ]
- 何十万ものスレッドをサポートするようなシステムもあるんだよね?
どういう構造になってんだろ 根本的に考え方からちがうのかな?
- 271 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 19:01:51 ]
- >>270
カーネルスレッドは使わない(ユーザスレッドでやる)、か、そういうスレッドを サポートしたカーネルでないと無理。普通のUnixの普通のカーネル(含むLinux) とかだと無理。
- 272 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 21:55:16 ]
- OSはWindowsXPなんですよ
で、ソースですが for( int i=0; i<2000; i++ ) { _beginthred( DoIt, 0, NULL ); } void DoIt( void * ) { DownloadURL( URL, filename ); _endthread(); } ってな感じですけど ほとんど同時時間にスレッドを起動させてるのですが、 タイムスライスが各スレッドに割り当てられないのでしょうかね? それともやっぱり >>232 さんの言っているように サーバー側が延滞処理をほどこしているんでしょうかね? 問い合わせたくてもあまり進んで聞けるようなことではないので
- 273 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 22:05:16 ]
- >272
スタック用の仮想メモリが足りなくなってない? あるいは、その呼んでいるDownloadURLが STAみたいな実装とかw >261 IOが支配的なスレッドで、タイムスライスの意味なんか ほとんどないとおもうけど。
- 274 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 22:48:50 ]
- 同一サーバにHTTPコネクションを2000張ろうとしていたオチと予想
- 275 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 23:28:21 ]
- Irvineとかで試してみればどうかな
|

|