[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/09 17:44 / Filesize : 232 KB / Number-of Response : 919
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

マルチスレッドプログラミング相談室 その7



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】

【言語】

【実行環境】

【その他突起する事項】

528 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 14:33:39 ]
>>527
ただし、いつもそのように分割されるとは限らない。

529 名前:デフォルトの名無しさん [2009/04/13(月) 22:54:34 ]
volatile最強杉www

530 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 10:18:14 ]
fread等でのデータ読み込みをシングルスレッドで実行する場合と
マルチスレッドで実行し、メインスレッドでは出来るだけ何もしない場合の速度は同程度になるものでしょうか?

531 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 10:27:26 ]
>>530
速度は実測が基本。

たぶんその比較内容だと、激しく環境(ハードウェア、OS、コンパイラ)に依存する。

532 名前:530 mailto:sage [2009/04/14(火) 10:57:26 ]
WindowsXP、vc2003、C2D E7200です。
timeGetTimeで測定した所、
マルチスレッド側の速度が安定しないのですが、
100kb程度のデータで2倍、1mb程度だと4割程度の速度差になりました

メインスレッドは以下のようなループになっていています
while(1){
 if(PeekMessage(&msg,0,0,0,PM_NOREMOVE)){
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 } else {
  // メインスレッド

 }
}

533 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 11:00:25 ]
色々条件がよく判らんが、ここが一番判らん。
>100kb程度のデータで2倍、1mb程度だと4割程度の速度差になりました
2倍の速度差と4割の速度差ってどういう意味なんだか。
シングルスレッドに対してマルチスレッド版は2倍の速度差、つまり3倍所要時間が掛かったのか?

534 名前:530 mailto:sage [2009/04/14(火) 11:11:23 ]
すみません、
所要時間
    シングル マルチ
100kb 0.013秒  0.025秒
1mb  0.100秒  0.140秒

です

535 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 11:17:22 ]
>>530
マルチスレッドは、複数のことを同時にしたいときに使う技術なので、
そういう視点で選択した方がいいですよ。

ただ速度といっても、プライマリスレッドからストレージアクセスを
しているときキャンセルボタンを押したいんだけどその反応が鈍い、とか、
ストレージをアクセスしながらムービーを表示しているのだけれどコマ落ちする、とか、
単純コピーを速くしたい、では、とるべき手段に違いがありすぎます。

単にあるデータをストレージから読み込む処理だけに着目するなら、シンプルな
シングルスレッドの方が高速になることが多いと思います。
予め別のスレッドで利用するファイルを予測してアクセスし、キャッシュに入れておく
などというのはまた別の問題ですが。

536 名前:530 mailto:sage [2009/04/14(火) 11:33:30 ]
>>535
ありがとうございます
極力シングルで動作できるような方法考えることにします



537 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 14:10:04 ]
>>435
Phenomの2コアで2スレッド動かしたら2.2倍以上のスコアを叩き出した。
確かに2倍になる訳じゃないね。但し、配列をL2とL3に合わせて巧く分割
できた場合に限るけど。あと、OSのや他プロセスのボトルネックがある分
やっぱりマルチコアの方が早いね。実質90%でしか動けないシングルは倍
にしても180%だけど、90%+100%で動けるマルチコアだと実質190%で10%
ぐらい早くなる。

538 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 14:41:22 ]
>>521
別にvolatile使わなくても問題なくね?
static int key=1;
void Thread0()
{
 key=0;//volatile指定が無い場合消失する可能性がある。
 Sleep(100);
 key=1;
}
void Thread1()
{
  while ( key ){ count++; }
}
こんな事でもしない限り無限ループにならんべや。
こんなコード書くことまず無いだろ。

それと、そもそも、グローバル変数使うなよ。

539 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 19:33:59 ]
>>538
バカでしょ

540 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 22:08:19 ]
>>538
まず、ネタなのかマジなのかを書いてくれ。

541 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 22:25:33 ]
>>538
バカなの?死ぬの?

542 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 22:53:09 ]
>>539-541
まじか。何で?

543 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 23:02:48 ]
volatileを使うと排他制御しなくて
よくなるから必要

544 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 23:19:55 ]
それは誤り

545 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 23:50:48 ]
keyをテストする所にメモリバリア入れないと駄目じゃないかね

546 名前:デフォルトの名無しさん mailto:sage [2009/04/20(月) 01:29:15 ]
例えばJavaやC#などだと参照してる変数がvolatileだと期待通りに動くが、
そうじゃないとどうなるか分からんのじゃない?




547 名前:デフォルトの名無しさん mailto:sage [2009/04/20(月) 15:54:13 ]
>>543
volatileと排他制御はなんの関係もないぞ。
volatileは最適化の抑止で、せいぜい>>538の様な事や
レジスタだけでなくメモリ側にも変数を割り当てるぐらいだ。
そもそも、CやC++に排他制御なんて概念は無いから
クリティカルセクションなんかを使う他無い。
ちなみに、Javaは排他制御がかかるが、グローバル変数
と言っているからCかC++だ。もしかして、間違えてないか?

548 名前:デフォルトの名無しさん mailto:sage [2009/04/20(月) 16:04:59 ]
 で、>>539-541は、人をバカ呼ばわりしただけの
まっとうな理由あるんでしょうねぇ。まさか、Javaや
C#のvolatileしか知らない癖にバカにしてたなんて
恥ずかしい理由じゃありませんよねぇ当然。

549 名前:デフォルトの名無しさん mailto:sage [2009/04/20(月) 16:23:18 ]

J

550 名前:デフォルトの名無しさん mailto:sage [2009/04/20(月) 19:35:31 ]
【OS】WindowsXP SP3
【言語】C
ソース ttp://f50.aaa.livedoor.jp/~iwazaki/uploader/src/up2117.txt
↑をcygwinでコンパイルすると
In function `thread_func':
14: warning: assignment makes integer from pointer without a cast
In function `main':
54: warning: passing arg 3 of `pthread_create' from incompatible pointer type
というエラーが出ます。
14行目と54行目が悪いことはわかりますが具体的な原因がわかりません。
ちなみにexeファイルは生成されます。

よろしくお願いします。

551 名前:デフォルトの名無しさん mailto:sage [2009/04/20(月) 20:32:51 ]
>>550
4: warning: assignment makes integer from pointer without a cast
In function `main':
キャスト無しじゃ整数をポインタにできないっていうような事書いてあるね。

pthreadのプロトタイプはこんな感じで第3引数には関数ポインタを、第4引数にはvoidポインタを取るように
なってる?
int pthread_create(pthread_t * thread, pthread_attr_t * attr, void * (*start_routine)(void *), void * arg);

君のコードだといずれもdoubleにキャストしているけど何故だい?
pthread_create(&a[i], NULL, (double *)thread_func, (double *)array);

※スレッドなんて飛躍したものに手を出す前にこの手のエラーを自己解決できる
程度には言語機能を勉強し直した方がいい。

552 名前:デフォルトの名無しさん mailto:sage [2009/04/20(月) 20:41:56 ]
>>550
んだんだ、
それに、Cなんだから、void * が絡むときはキャストしない方が
素直で、読みやすいコードになる。
たとえば、
double *data = (double *) arg;
は、
double *data = arg;
としろ、ってことね。C++から来た人はこれをやりたがるのね。
C++だとこの場合にもキャストが必要だから。

乱文澄まそ

553 名前:デフォルトの名無しさん mailto:sage [2009/04/21(火) 01:49:59 ]
>>551
pthread_create(&a[i], NULL, (double *)thread_func, (double *)array);
は単に見落としていたようです。
お手数掛けて申し訳ないです。
直したらこの行のエラーは出なくなりました。

>>552
C++をやっていたわけではないのですが、配布されたソースコードの例にはこの形で書かれていたのでそれに準じて書きました。

そしてまだ14行目でエラーが出ますがpthread_selfの扱い方はそもそもこれでよいのでしょうか?
ちょろっと調べて出てきたものを使っただけなのでよく理解していません。

554 名前:553 mailto:sage [2009/04/21(火) 02:06:23 ]
すみません、調べたらわかりました。
ただし他の問題が浮上しました。
pthread_t型をint型か何かに変換できないんですかね・・・。

555 名前:デフォルトの名無しさん mailto:sage [2009/04/21(火) 02:31:33 ]
>>554
pthread_tはポインタか構造体かなんかでしょ。
そもそも、別の型に代入しちゃいけない。
語のライブラリだと結構やろうと思えば別の型
に無理やり代入する事も出きるけどしちゃいけない、
内部に干渉しちゃいけないものがある。
大体識別値(discriptor)と呼ばれるものなんかがそう。
あと、初心者の内はメモリ操作が簡単にできる事が解って乱用する
人がいるがポインタのキャストはやたらめったらつかうもんじゃない。

てか、君の悩みはスレッド以前の問題だから、Cの初心者スレなんか
で質問しなさい。




556 名前:デフォルトの名無しさん mailto:sage [2009/04/21(火) 20:37:55 ]
言い方は気にくわないなw
小さい芽潰して楽しんでるふうにしかみえねーよ老害

>>554
pthread_tはunsinged longのtypedefだよ




557 名前:デフォルトの名無しさん mailto:sage [2009/04/21(火) 21:56:02 ]
>>556
何を言ってるんだおまえは? >>550のwarningを100回読み直してから出直してこい

558 名前:デフォルトの名無しさん mailto:sage [2009/04/22(水) 00:05:38 ]
>小さい芽潰して楽しんでるふうにしかみえねーよ老害
ふーん
芽をつぶして楽しんでて害なんだ
ふーん


559 名前:デフォルトの名無しさん mailto:sage [2009/04/22(水) 01:49:54 ]
そうなんじゃね、多分。

560 名前:デフォルトの名無しさん mailto:sage [2009/04/22(水) 02:46:06 ]
大人なんだからもっと仲良くしろよ

561 名前:デフォルトの名無しさん mailto:sage [2009/04/22(水) 21:38:45 ]
歯痛制御で俺の虫歯を何とかしてくれ

562 名前:デフォルトの名無しさん mailto:sage [2009/04/22(水) 22:28:22 ]
チュイーン ギキィィーー

563 名前:555 mailto:sage [2009/04/22(水) 22:56:29 ]
>>556
 俺、21歳なんだが。3D関連でC++始めて5年以上にはなるが、
そうか俺も、もう老害か・・・。

564 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 00:01:02 ]
>>561
本業歯医者の趣味グラマだけど何か用?

565 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 02:10:25 ]
>>564
医者の趣味グラマっておおいな。
LHAも医者だし猫プロの筆者も医者。
しかも、本業より優秀そうなんだよな・・・。

566 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 02:33:52 ]
本当は工学系にいきたかったのに、
なまじっか頭いいと医療系への進学を勧められちゃう奴って多いからな



567 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 09:19:51 ]
いつも思うんだけど、歯科治療技術も日々発展してるだろうから
古い医者より新しいところの方がいいのかねえ

568 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 11:19:32 ]
ジャストシステムのスタートアップにも医学生がいたな。
人間って本当に不公平にできてるよ。

569 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 12:48:15 ]
>>564
予約時間の十分前には歯科に着いているのに
待合室で一時間待たされ、診察室に通されたと思ったら
また三十分以上待たされるのを何とかしてくれ

どう見ても歯科医と歯科助手がデッドロックを起こしているようでなかなか回ってこない

570 名前:デフォルトの名無しさん [2009/04/23(木) 19:35:34 ]
>>569
誰がうまいこと言えとw
デッドロックは言いえて妙だったわ。

571 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 23:58:32 ]
>>567
少なくとも、レントゲン撮影したら「現像するから日を改めて」なんてところは止めた方がいい。
今時、治療椅子ごとに端末があってそこで見られるのが当たり前。

572 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 09:00:21 ]
>>571
端末は無いけど、数分で現像したフィルムができるのが普通じゃない?
2,30年前からそうだったと思うんだけど

573 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 09:44:28 ]
いい加減にしとけよ

574 名前:デフォルトの名無しさん [2009/04/24(金) 11:57:45 ]
マルチスレッドと減増
関係あっても、遠い存在のような


575 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 17:51:20 ]
>>556
老害ではなく、基地害だ


576 名前:デフォルトの名無しさん mailto:sage [2009/05/02(土) 22:30:20 ]
俺の日記帳
今日は5月2日です。
何してるの?



577 名前:デフォルトの名無しさん [2009/05/04(月) 23:25:22 ]
C++0xではマルチスレッドプログラムを組むのは
容易になるのであろうか

578 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 23:26:23 ]
C++でマルチスレッドは危険ですよ

579 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 23:36:49 ]
>>578
Win32本では平気でマルチスレッド走らせる例が書いてあるけど
デッドロックについても詳しく説明してある

580 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 04:20:22 ]
>>579
なんだその会話になってないレスは

581 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 06:50:37 ]
CやC++の言語レベルではマルチスレッドについての取り決めはない。
ライブラリ(pthreadなど)やプラットフォーム(osやハードウェア)や実装(コンパイラ)レベルで、
扱いが決められているので、そういったものの前提抜きでマルチスレッドは語れない。

582 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 09:33:35 ]
メモリモデルの仮定が入っちゃうからやりにくいだろうなあ

583 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 09:58:42 ]
>577
concurrency 周りが大幅に強化されてるんで、恐らくは。

584 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 12:04:34 ]
マルチスレッドにする利点は何?
複数の処理を同時に走らせることができるなんて妄想は無しで。

585 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 12:10:53 ]
世界の全てが妄想なので、答えは消滅しました。

586 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 12:12:54 ]
複数の処理を同時に走らせることができる、妄想で無しに。



587 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 13:11:27 ]
個人的には>>584が何故「複数の処理を同時に走らせることができる」ことが妄想だなんて妄想を抱いたのか知りたい希ガス。
マルチスレッドの利点は全てそこから派生しているはずなのだが。

588 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 13:25:02 ]
>>587
TSSは同時ではないとでも言いたいんじゃないか?

589 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 15:05:51 ]
>複数の処理を同時に走らせることができる
ってのはいわゆる手段なんで。
大元の目的は「暇をもてあましてるリソースを有効活用する」だな。
マルチスレッドはCPUがヒマしてる場合の、GPGPUはGPUがヒマしてる場合の手段だな。

>584がどんな妄想してるか迄はわからんが。


590 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 15:53:09 ]
>>589
それ以外にもあるぞ。むしろプログラマ的にいちばんうれしいのは、コンテキストの異なる処理を明示的な切り替え無しに同居させられることじゃなかろうか。
重い処理を別スレッドでガリガリ処理しつつ、その進行状況をGUIで表示するとか。

591 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 23:10:29 ]
ハァ?
すべてをファイル・デバイスにしてそれをpollすればシングルスレッドで可能ですが何か?

592 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 23:20:27 ]
スレタイ無視

593 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 23:39:00 ]
昔のunixはスレッドなしでもfork/execだけでたいていの事はやれてたな。

594 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 05:27:53 ]
>>591
ちょっと話違うが、Androidのセンサーまわりの設計もそんな感じ。
だが、そのファイルディスクリプタをもらう元が、1つしかなかったり
してセンサーごとにドライバが作れない。

1.0のころはモジュール化すらされてなかったり、1.5になっても
いまだダセー設計だし。設計したやつの顔が見たいな。

595 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 08:32:10 ]
ドライバといった低レベルI/O処理の基本はスレッドより割り込み。
割り込みがないディバイスだとポーリングも使うけど。

596 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 09:07:05 ]
何かの処理で待ちも含めてぐるぐる回りながら、他の処理も同時にやりたい、とかいう場合に
いちいち処理を細切れにしてpollを含むメインループから呼び出す形に縛られるのは面倒だわな。

マジレスすると。



597 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 10:29:43 ]
>>593
でも今はマルチスレッドがサポートされているということは、その煩雑な方式では力不足だったってことだよね。

598 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 10:51:01 ]
今のところは、
やることを細切れにできるようにしておいて
pollするスレッド(大半の時間は待機)が
少数のワーカーに仕事を振り分け
ワーカーはひたすら仕事だけを待ちつづける、というやり方が
I/O待ちやマルチCPU(コア)を有効に生かせ、
メモリやコンテキストスイッチのロスも少なく出来ると言われてるな。

599 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 10:56:07 ]
開発効率という効率を無視すれば、それがベストだねw

600 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 13:17:08 ]
OSのスケジューラをエミュレートしてるだけのような

601 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 15:04:43 ]
コア数を大幅に越えるスレッドを生成すると、
コンテキストスイッチのせいでむしろ性能が低下する。ってのは本当なの?
実測して確かめたいんだけど、どういうコードを書けばいいのか解らん。
えろいひと教えて

602 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 15:07:34 ]
スレッドプールにすりゃ解決よ

603 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 15:11:52 ]
>>601
本当
スレッドに手を出した頃それに嵌ったことがある
各スレッドの同期にmutex/conditionを使う形で大量のスレッド作って試してみればわかるよ
むやみにスレッド数を多くするのはそもそも設計が良くないです

604 名前:デフォルトの名無しさん [2009/05/10(日) 16:01:38 ]
オーバーヘッドが増大する。 スレッドの多さは関係無し。 
たとえば1ms以内で終了するスレッドを生成すれば効率悪い。

605 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 16:02:56 ]
>>601
スレッドって、一般にはコンテキストスイッチが入らない
(だから軽い)というモノだろう?

原理的には性能低下は無い。
但し、実際のところコア間でキャッシュを共有してたり、
メモリバスを共有してるので、複数のコアを同時に使うことで
シングルコアよりも性能低下することはありうる。


606 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 16:22:26 ]
マルチスレッドのプログラム組んでるんでて
ある変数に複数のスレッドから同時にアクセスできるときは
排他的処理しないとだめ?
というか たぶん今のエラーはそうだろうと思う



607 名前:デフォルトの名無しさん [2009/05/10(日) 16:24:10 ]
複数スレッドからアクセスしても、OSがエラーはいたことはないな。
値は、ぶっ壊れるけどね。

608 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 16:28:00 ]
読むだけなら問題ない

609 名前:デフォルトの名無しさん [2009/05/10(日) 16:29:54 ]
読み書きしても、エラーでたことない。 
たとえばグローバルsum=0に、複数スレッドから足し算してもエラーで停止しないが。

610 名前:デフォルトの名無しさん [2009/05/10(日) 16:31:49 ]
どういった場合に、メモリーエラーが起こるのかが知りたい。

611 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 16:33:36 ]
>>605
> スレッドって、一般にはコンテキストスイッチが入らない

今コンキストスイッチしないのって絶滅危惧種だろ

612 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 16:36:05 ]
なるほど
変数がスタックで削除したり追加したりだからダメなのか

613 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 18:23:53 ]
>>605
マテ、スレッドでもコンテキストスイッチは発生するぞ。
スレッドが(プロセスに比べて)軽いのは、スタックとレジスタだけ
切り替えれば済む(これもコンテキストの切り替えだ)からであって、
コンテキストスイッチそのものが行われないからじゃない。

614 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 18:26:42 ]
1CPUの場合はタイムスライスだけになるから減らないが、
CPUが複数ならスイッチ自体を減らせるという話じゃないかい。


615 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 22:05:51 ]
>>613
ユーザランドでのスレッド実装だと
カーネルモードに入る回数が少なくて済むとかじゃね?

というかこの手のは、何が重いか時代により激しく違ってくるから
一般論といってもそれが何時のものかによるなあ

616 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 21:55:27 ]
昔を語るのが一般とは思えない。



617 名前:601 mailto:sage [2009/05/11(月) 22:46:47 ]
時代によって変わるもんなのか。
レジスタ、スタックの退避とか、カーネルに入って出てくる処理とかが重いのかとかとか思ってたんだけど。
fiberは軽いよ。とか聞くけど、それはおいといて。
>>603
mutexとか排他は考えないで、純粋に「コンテキストスイッチ」処理がどれくらい重いもんなのか
図りたい。
linuxでpthread使ってやろうと思ってるんだけど、どんなコードを書けばいいんだろ
単純に0から0xffffffffまで足す処理をシングルスレッドでやるか、
0〜0xffを足す処理を0x1010101個のスレッド立てて計算させて、どっちが早いか。とか?<そりゃないだろって

618 名前:デフォルトの名無しさん [2009/05/11(月) 22:57:13 ]
>>617
CPUの数だけ分割するのが速い

619 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 23:28:58 ]
例えば
20ms(OS次第)以上かかる計算処理を一つのJobとして
Job計10000個をキューに入れる。
スレッドをプールしておいて、各スレッドはキューからJobを取り出してひたすら実行する。
この時、プールするスレッド数をプロセッサ数と同数の場合と2000個の場合とで実行時間を計る。

現実的には、スタック領域以外にも
各スレッドで多少の独立したメモリ領域は使うことが多いと思われるので
ただの(レジスタやスタックで納まる)計算はではなく、
16Kなり64Kなりの領域をスレッド毎に確保しておいて
その内部の値を使った計算とする。

等というのはどうだろうか。

620 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 23:39:02 ]
別にキューに入れる必要無いな。
同じことを繰り返すだけなんだから、CASを使ったカウントアップだけして
一定の数字になったらスレッド終了で充分か。
これなら、共有メモリを使えば、プロセスとの比較も出来る。

ただ、スレッドは「スタートのシグナル」を全部同時に出すことが出来るけど
プロセスだとどうなんだろ。全然知らない。

621 名前:デフォルトの名無しさん [2009/05/21(木) 21:54:47 ]
昔はPVM、今の時代はMPI
そしてOpenMPとMPIのハイブリッド実行が主流なのだろうか

622 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 22:39:20 ]
>同じことを繰り返すだけなんだから、CASを使ったカウントアップだけして
>一定の数字になったらスレッド終了で充分か。

こんな非現実的な処理の時間を計測して何の意味があるわけ?


623 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 22:40:10 ]
おそらくプロセッサ(コア)が増えれば増えるほど遅くなると思うけど。


624 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 22:44:10 ]
ああ読み違えてたすまんのう
単に処理繰り返し数のカウントで使うだけってことね…


625 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 23:23:37 ]
VC(VisualStudio2005)でコーディングしております。

「g_hThread = (HANDLE)_beginthreadex(NULL,0,MainLoop,0,0,&g_dwThreadId)」
で、スレッドを生成し、そちらで、

if(GetAsyncKeyState(VK_UP)&0x8000)

ではキーが取得できるのに、

GetKeyboardState(diks)
if(diks[VK_UP] & 0x80)

ではキーが取得できません。
どうも、メッセージキューやらが原因みたいですが、理屈がイマイチわかりません。
解決策や問題点など、教えていただけると幸いです

626 名前:626 mailto:sage [2009/05/22(金) 00:14:01 ]
追記です。

そもそもGetKeyboardState()はメッセージキューに溜まったものを見るものであって、
新しく生成したスレッドでは、肝心のメッセージを取得することができない、、、
というあたりまではなんとなく理解できました

ちなみにやりたいことはキー情報の一括取得(できればリアルタイムの)です。
(GetAsyncKeyState()では1つ1つしか取れないので・・・
引き続き、解決策などありましたら、お願いします



627 名前:626 mailto:sage [2009/05/22(金) 01:06:46 ]
生成したスレッドの方で、

// Threadのインプットのアタッチ
int targetThread, selfThread;
targetThread = GetWindowThreadProcessId(GetForegroundWindow(), NULL);
selfThread = GetCurrentThreadId();
AttachThreadInput(selfThread, targetThread, TRUE );

/*===== メインループ =====*/

// Threadを切り離す
AttachThreadInput(selfThread, targetThread, FALSE );

とすれば、GetKeyboardState()でも一応取得できました。
荒療治な気がしますが・・・
もっと良い方法などありましたら、お願いします

628 名前: ◆0uxK91AxII mailto:sage [2009/05/22(金) 02:41:05 ]
>>617
適当なsystemcallを行い、前後でCPUのtimestampでも読めば、
最も軽い場合については、調べられる。

>>625
DirectInputを使うとか。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<232KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef