[表示 : 全て 最新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】

【言語】

【実行環境】

【その他突起する事項】

448 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 19:47:19 ]
>>443
OpenMP に期待しすぎ。

何でもかんでも 3.9倍になる魔法なら俺も欲しいが。(w

449 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 02:39:25 ]
>デュアルコアやクァッドコアのCPUだと、マルチスレッド化すると理論上
>2倍や4倍で動くと勘違いしているヤツもたまにいるよね。おまえのOSは
>いったいいくつプロセスが動いていると思っているんだと、小一時間。(略

略とか言われても。誰か解読してあげてよ。
少なくとも実測で3.9倍でてるわけだから、理論上は4倍出ると言っても問題ないよな。
たくさんのプロセスが動いてるとき、マルチコアだとちゃんと速くなるよな。
意味不明。

450 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 03:13:14 ]
どういう問題を解いて3.9倍なのか書かないと意味がないかと。

知人の計算屋さんがAMDの8CPU機にメモリしこたま積んで
巨大グラフを相手にした問題を解いていたことがありましたが、
問題の構造上メモリアクセスに局所性が全くないのでCPUの
速度や数以前にメモリ帯域が飽和して速度が頭打ちになると
ぼやいていた事が。

451 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 14:17:04 ]
>>450
まあその辺に桁違いのコストを掛けてクリアしてることが
スパコンの存在意義だしね


452 名前:443 mailto:sage [2009/02/28(土) 16:53:30 ]
>>448
期待するも何も、実験した結果だし。

>>450
>445に書いた通り、只管FFTを計算するようなプログラムと言うくらい。

その結果では、4core2cpuのシステムで、4並列まではびっくりするほどリニアリティがあるけど、
その先は一つ増やしても0.7個分くらいしかパフォーマンスが上がらなかった記憶が。
# 8並列で7倍くらいかな? 必要なら記録を探してくるけど。

尤も、自作のプログラムだと4並列でも8並列でも殆ど変わらなくて泣けた罠。
インテル某氏の話だと、MKLはOpenMPで並列化してもリニアリティを確保できるように
作られているそうで、折角FFTを使わない版を作ったのにお蔵入りになりそうだったり。

453 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 16:55:08 ]
スパコンと言えばTOP500で10位にWin鯖クラスタが付けてたけど
(CPUとメモリだけ)似たような構成の他のと比べて特に劣ってるようでも秀でてるようでもなかった

454 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 18:46:09 ]
>>452
OpenMP に頼って満足してる人はこのスレに用はないでしょ。
どうぞお引取りください。

455 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 19:01:43 ]
>>454
>452じゃないけどここはマルチスレッド全般でしょ?
>1にも「OS・言語・環境は問わない」って書いてるんだからいいと思うけど
ただし>452=443=440はおバカさんだと思うけどねw

456 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 21:22:08 ]
OpenMP の話題がまずいと言ってるわけじゃなくて、「OpenMP
に頼って満足してる人」って書いてあるんだが...。

スレタイに「相談室」って書いてあるのが見えませんか?



457 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 21:41:20 ]
>>456
相談した人にOpenMPに頼って満足してるってレスするのは問題ないだろ

458 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 22:04:33 ]
で、どこに相談した人がいるんだ? (w

459 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 22:09:48 ]
俺は>452個人の話はしてないんだが。お前誰と闘ってるんだ?

460 名前:452 mailto:sage [2009/02/28(土) 22:13:07 ]
まぁ、私は「OpenMPに頼って満足してる」のではなく、「OpenMPを巧く使うMKLに勝てなくて泣いてる」のだけれどねw

461 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 22:13:48 ]
よくわからないけど、置いときますね。
#light
open System.Threading
let tid = fun () -> Thread.CurrentThread.ManagedThreadId
let sleep = fun (t:int) -> System.Threading.Thread.Sleep t
let x1() = [|1..100|] |> Array.map(fun x -> sleep(100); [|x ; tid()|])
let x2 = [|1..100|] |> Array.map(fun x -> async { sleep(100); return [|x ; tid()|] } ) |> Async.Parallel
let _ = printfn "%A" (x1()); printfn "%A" (Async.Run x2)


462 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 22:35:01 ]
>>450
おれは、>>452 個人の話をしてるんですけど。

まさか、>>454 に書いてあるアンカーすら見えなくなるほど
頭に血が上ってるとか? (w

463 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 22:48:56 ]
>>462
俺は「OpenMPに頼って満足してる」のを理由に追い出そうとしたことに
ついて話をしている。>>452個人のことはどうでもいい。
どうやらただの煽りあいになりそうだからこの話題は終了する。

464 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 02:32:16 ]
>>460
何故勝てなくて泣く必要があるのか少し気になる。

465 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 16:47:46 ]
>>463
「相談した人もいないのに勝手に OpenMP に頼って満足してる人」は
このスレに用はないでしょ。

これでいいか?

> >>452個人のことはどうでもいい。

# >>452 にレスしてるのに、勝手に割り込んできて逆切れかよ...

466 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 18:49:02 ]
OpenMPってどんなの?たとえば、Videoのエンコード・デコード
処理が書いてある逐次処理のCなりC++のソースコードが
あったら、ほとんど変更なしに並列化できるん?

それとも、既存のソースは一から書き直しくらいしないと
パフォーマンスは出ない?



467 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 18:53:11 ]
相談者が現れたので>>452の出番ですwww

468 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 18:55:20 ]
それ以前に446にふさわしい言葉は「ググれカス」だろう。

469 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 19:14:45 ]
>>466
OpenMPスレという物もあってだな(ry

470 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 02:02:51 ]
OpenMP詳細しらんが、既存のソースは1から書き直しまで
いかなくても、大幅に書き直さないとパフォーマンスは
でないのだろうな。常識的に考えて。

コア数に応じてリニアにパフォーマンスがあがって、既存
のソースから簡単に移行できますよ、っつーなら神なのだが。

471 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 02:35:03 ]
それを可能にするには関数型など副作用のない言語が有利
今更言うことでもないが

472 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 02:38:08 ]
>>471
んなこたーわかってんだよ。新規にはじめる分野はそれでもえーよ。
資産の移行も重要なんだよ。

473 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 02:42:00 ]
おまえの書いたコードなんぞ資産と呼ぶ価値も移行する価値も無いから気にすんな

474 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 02:46:42 ]
>>473
俺の書いたコードが資産だなんて、いついったんだよ?
煽るにしろ、頭の悪さが透けてるんだよ。

475 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 03:08:36 ]
>>472の「おまえ」が>>474だなんて、いついったんだよ?
煽るにしろ、頭の悪さが透けてるんだよ。

476 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 11:59:03 ]
これは惨めなミス。



477 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 13:39:15 ]
>デュアルコアやクァッドコアのCPUだと、マルチスレッド化すると理論上
>2倍や4倍で動くと勘違いしているヤツもたまにいるよね。おまえのOSは
>いったいいくつプロセスが動いていると思っているんだと、小一時間。(略

478 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 23:44:21 ]
>>477
こいつの言ってることまじでわからんのだが・・・。
こいつがアフォなのか、俺がアフォなのか誰か解説よろしく!

479 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 00:03:02 ]
コア1 ●◎◎◎◎◎◎◎◎◎
コア2 ●○○○○○○○○○
コア3 ●○○○○○○○○○
コア4 ●○○○○○○○○○

         ↓

コア1 ●◎◎◎◎◎◎◎◎◎
コア2 ●◎◎◎◎◎◎◎◎◎
コア3 ●◎◎◎◎◎◎◎◎◎
コア4 ●◎◎◎◎◎◎◎◎◎

○ 空き
● 別プロセス
◎ 自プロセス

4倍になる

480 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 00:28:55 ]
>>477
基本的には>>477がちょっとずれていると思う。
コア数に比例してリニアに2倍4倍にならないのは事実。
でもハウスキーピングなプロセスの数云々は性能を押し下げる
理由としてはどちらかというとマイナーな部類だと思う。

481 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 00:29:19 ]
ちょっとゲロでちゃった

482 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 00:35:18 ]
並列化効率の話がまず最初だよね。
アムダールの法則。

483 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 00:38:03 ]
>>480
いや、こうまで単純化していいかどうかわからんが、
ハウスキーピングのプロセスがほぼsleep状態と
仮定したら無視できるわけで。

というより、4コア100%使用する処理走らせるんだったら、
無視できるほどなわけで(スワップデーモンとか
ハードアクセスの重いスレッドが走らない前提なら)。

バスネックでリニアに伸びないとか、キャッシュの競合
だとかいうならまだしも。やっぱり俺には>>477はさっぱ
りわからん。

484 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 01:50:33 ]
アイドル状態のプロセスでもビジーループでCPU消費してる
とか思ってんじゃないの

485 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 01:56:06 ]
>>484
単に1つのプロセスが1コアを占有し続けると考えているのではあるまいか。

486 名前:デフォルトの名無しさん [2009/03/14(土) 05:22:42 ]
マルチスレッドについて質問です。
環境は VC++2005 SDK です。

子ウィンドウの WM_CREATE にて無限ループをさせても
親ウィンドウが操作できる
事を実現したいです。

他スレにて、
>Windowsのウィンドウはスレッドに属する。
>ウィンドウプロシージャはウィンドウの属するスレッドで実行される。
>さて、どのスレッドに属するかというと、CreateWindow(Ex)を呼んだスレッド。
というレスをいただき、新しいスレッドにてCreateWindow する手段を取りました。
子ウィンドウの WM_CREATE までは処理が進むのですが、
無限ループどころか for (i=0; i<100; i++) { i = i; } を WM_CREATE 内に
記述した途端にフリーズする様になってしまいました。
コメントアウトすれば、問題なく動作します。

ファイルをアップロードしたので、見ていただけないでしょうか?
ttp://www3.uploda.org/uporg0077.cpp.html
受信パスは test です。
どのように修正すれば良いか、ご教授願います。
よろしくお願いします。



487 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 05:54:15 ]
>>486
windowsのウィンドは、プライマリスレッドで生成しないと
いろいろいろいろいろいろいろいろトラブルが起こるので、そういう設計は見直した方がいい。
そもそも子ウィンドウは親ウィンドウと同じスレッドで生成しないとトラブルになる。

例えば親をAスレッドが、子をBスレッドが作ったりすると、
親のプロシージャはAスレッドが実行し、子のプロシージャはBスレッドが実行することになる。
子から親への通知や親から子への通知がメッセージで発生したら発生したら、
デッドロックの宝庫になることは想像に難くない。

それ以前にメッセージループって親子で共通のような気が・・・

488 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 06:05:38 ]
>>486
アップロードしたプログラムだとそもそも子ウインドウは表示されないだろ。

動くようにするには子ウインドウと呼んでいるものを、新しいスレッドのウインドウにすること。
つまりメッセージループをそこでまわす。

MSG msg;
ShowWindow(hChild, SW_SHOWDEFAULT);
UpdateWindow(hChild);
while(GetMessage(&msg, NULL, 0, 0)) {
 TranslateMessage(&msg);
 DispatchMessage(&msg);
}
//static int k = 0;
//k = 1;
//while (1)
//  k++;


489 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 06:16:38 ]
WM_CREATEで無限ループしたらCreateWindowから制御が戻らないわけだが

490 名前:486 [2009/03/14(土) 15:00:34 ]
>>487
色々と問題があるという事ですか...
そこまでは考えておりませんでした。
ですが、今はこの枠組みで作ろうと思います。
アドバイスありがとうございます。

>>488
メッセージのループを回すのを忘れておりました。
ありがとうございます。
ただ、今回はメッセージのループのみが欲しいので
ウィンドウは非常時で構いません。

>>489
確かにそうでした。
あるメッセージを受けた時に
その中で Sleep(1000); を実行する事にしました。

・・・が、それでも親ウィンドウが 1000 ミリ秒 固まってしまいました。

以下の様にしておりますが、
これでは各ウィンドウは別スレッドで動かないのでしょうか?
ttp://www2.uploda.org/uporg2088151.cpp.html
受信パスは test です。
よろしくお願いします。

491 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 15:07:12 ]
作ろうと思います、じゃねー
動作が未定義なんだからそんなプログラミングすんな

492 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 15:18:07 ]
>>491
互いのウィンドウでメッセージのやり取りを頻繁にするような事は致しません。
親スレッドとは独立したウィンドウプロシージャのメッセージループ
(表現が合っているかは自信がありませんが)が欲しいのです。

以下、長文失礼します。

5 [msec] の情報が入るサイズのバッファを複数用意し
信号をバッファに入力し、あるバッファが満タンになったら
windows からメッセージが投げられ、
受け取ったメッセージ内で信号処理をする、
というものを作っています。
この時、信号処理に時間がかかるため
常にメッセージを受け取った時の処理を行ってしまい
メニュー操作が出来なくなる状態です。

アプリケーションを強制終了すると、信号処理した数値列が
ちゃんとファイル出力されているので
信号の入力及び信号処理は問題なく進んでいます。

これを解決するにはメニューを持つウィンドウと
メッセージループのあるウィンドウを別スレッドで走らせれば良い
と考えました。


493 名前:492 mailto:sage [2009/03/14(土) 15:53:32 ]
連稿失礼します。
Sleep(1000); を

int i, j;
for (i=0, j=0; i<1000000000; i++)
j++;

としてみましたが、結果は同じでした。
親ウィンドウのスレッドにフォーカスが戻っていないのでしょうか?

494 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 16:43:47 ]
子ウィンドウ作る必要なんて無いところを、
わざわざ回りくどいやり方しているようにしか思えないんだけど。
ワーカースレッドにデータ送りたいだけじゃないの?

495 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 18:10:18 ]
>>494
ワーカースレッドについて知識が無かったのでググってみました。
MFCでのみ使用可能な関数でしか作れない事が判りました。
今はSDKで組んでおり、MFCは使った事が無いので今の私には使えそうにありません。
情報ありがとうございました。

496 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 18:28:36 ]
>>495
ワーカースレッドは概念であって、SDKのみだから作れないということは無いよ

そもそも、貴方のやろうとしていること自体がワーカースレッドの利用だ



497 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 15:23:44 ]
>>496
ワーカースレッドについて調べ方が間違っていたようです。
もっと調べを進めます。ありがとうございます。

498 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 20:09:14 ]
>>492
ワーカースレッドというのは、作業を行うスレッドという程度の意味です。
信号処理中はGUIが不要のようですので、GUIは1個のスレッドにまとめて下さい。
以下、基本は次のような処理になります。Q0とQ1のアクセスを排他制御して下さい。
プライマリスレッド
  メインウィンドウの作成。
  バッファ群を作成する。例えば5ms用のバッファをN個作成して、
  2個のキューQ0(未使用バッファ用)とQ1(充填済みバッファ用)を作成する
  バッファを全てQ0に格納し、スレッドA・Bを作成・実行する。
  以降はGUIによるスレッドA・Bのコントロールを行う

スレッドA(バッファ充填処理)
  1.信号受信処理の初期化
  2.Q0からバッファを取り出す。無ければ待つ。
  3.バッファを充填する処理(この辺で外部からのスレッド終了通知チェック)
  4.バッファが一杯になったらQ1へ入れ、2へ戻る
  
スレッドB(信号処理スレッド)
  #スレッドAで、Q1の格納数が0->1になったとき起こされる。
  1.Q1からバッファを取り出す(なければ待つ)
  2.信号処理(この辺で外部からのスレッド終了通知チェック)
  3.結果の出力
  4.バッファをQ0へ入れ、1へ戻る

499 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 20:18:36 ]
>>498
あー便所で説明してくれないと解らない

500 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 20:42:55 ]
>>499
ウホッいい男!

501 名前:492 mailto:sage [2009/03/15(日) 20:45:19 ]
>>498
詳しい構成、本当にありがとうございます。
頑張って理解してみます。

502 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 03:19:19 ]
void A::sync_fun() {
  boost::mutex::scoped_lock lock(m_);
  // 何かの処理
}

上のlockで待機しているスレッドがあるときにAのオブジェクトをdeleteするとスレッドは待機したままですね。
下のようにするかtimed_waitにする必要があるのか、そこまで気にすることもないのか。
みなさんはどうされますか?

void A::sync_fun() {
  boost::mutex::scoped_lock lock(m_);
  cond_.wait(lock, bind(&A::pred, this));
  if (invalid_) return;
  // 何かの処理
}

bool A::pred() const { return stat_ || invalid_; }

A::~A() throw() {
  {
    boost::mutex::scoped_lock lock(m_);
    invalid_ = true;
  }

  cond_.notify_all();
}


503 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 18:55:17 ]
>>502
どうするかは、何のクラスかによるだろう。
一般論でAが、sync_fun()実行中に破棄される可能性があって、
どうしても回避できないならAのデストラクタでunlockする。

504 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 16:12:48 ]
ダウンローダをマルチスレッドで作成しようと思っているのですが
スレッドを10個作り
それぞれにURLを追加して、次々にダウンロードさせる仕様にしようかと思っていますが
このスレッドの終了タイミングはどういった条件で終了すればいいでしょうか?

メインスレッドが終了するとこの10個のスレッドも終了するので
どうしたものかと考えています

505 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 16:19:45 ]
あげます
すいません

506 名前:デフォルトの名無しさん [2009/04/04(土) 16:20:37 ]
.



507 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 16:36:26 ]
>>504
何を聞きたいのかよく分からんけど、
メインスレッドで10個のスレッドの
終了待ちさせれば良いんでないの。

508 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 16:45:56 ]
>>507
なるほど
そういう手がありましたか
ありがとうございました

509 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 17:26:41 ]
何か一冊マルチスレッドの本読むのおすすめする

510 名前:デフォルトの名無しさん mailto:hage [2009/04/05(日) 04:12:53 ]
class Hoge{
public:
 void End(){
 /*他のスレッド、シグナルハンドラとかから呼ばれる */
 Lock_.GetLock(); // 実際はRAII使ってるよ
 continuable_ = false;
 //その他のリソース会報処理
 }

 void Task(){
 // thread poolから実行されるタスク。
 Lock_.GetLock();
 if( continuable_ == false ){ return; }
 // IO処理とか色々非同期でやる
 }
};

なんか、フラグ使ってやるのが嫌なんだけど、
非同期で実行されるオペレーションをキャンセルさせる
スマートな方法ってない他にない?
この実装は間違ってる?

511 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 11:59:52 ]
いいんじゃねえの。
スレッドを自発的に終了させるには
スレッド自身が何かをチェックしなけりゃならんし。

512 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 13:17:02 ]
間違ってないし、フラグを使う方法は普通によくある

513 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 19:31:13 ]
別プロセスにしてkill -9、これが最強。

514 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 19:36:59 ]
せめてSIGTERMでやんわり殺してやれよ。

515 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 12:50:48 ]
そうそう、せめて覚悟する時間くらいは与えてあげないと。
尤も、そうすると逆切れして殺しに来るかも試練が。

516 名前:デフォルトの名無しさん [2009/04/09(木) 00:33:31 ]
変数か構造体かクラスのインスタンスa,b,c,dがあるとして、
まず、スレッド1がaとbを使用、スレッド2がc,dを使用する。
その後、スレッド間通信とかでスレッド1も2も上のa,b,c,dを使用した処理が完了したことをスレッド1,2に伝える。
そして、スレッド1がa,cを使用、スレッド2がb,dを使用する。
といったような処理をするときに、特別にロックとか必要ですか。



517 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 00:58:51 ]
>その後、スレッド間通信とかでスレッド1も2も上のa,b,c,dを使用した処理が完了したことをスレッド1,2に伝える。
これで同期取ってるから、そこをちゃんとすればよい。

518 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 01:47:33 ]
弱い順序付けの場合だめな場合がありえるかもね

519 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 17:49:21 ]
ねーよw

520 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 19:12:35 ]
>>518
お前にとって同期ってなんだ?

521 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 19:52:20 ]
グローバル変数keyに対して、他のスレッドで値を変更してループの続行、終了を決める場合に
while ( key ){ count++; }
というコード書くとコンパイラの最適化によって、無限ループになる可能性があるということですが、
while ( *pk ){ count++; }
のようにアドレスから参照しようとしても同じことになるのでしょうか。

522 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 20:54:12 ]
わかんない。

つーか key を volatile にすりゃいいんでない?

523 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 21:01:11 ]
>>521
うん。十分ありえる。

524 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 21:07:43 ]
volatileで大丈夫そうですね。ありがとうございました。

525 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 11:51:26 ]
マルチスレッドがどういうタイミングで割り込まれるのかわからないのですが
たとえば、if(++i == n) のコードなら
iをインクリメントしてからnを比較するまでの間で
割り込まれる可能性はあるんでしょうか?

526 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 12:30:10 ]
あるよ
そもそも正しくインクリメントされることも保証されない
(CPUやコンパイル出力によるけど)

なぜなら、
(1) メモリからiの値を読み出す
(2) 値+1を計算する
(3) iの領域に計算結果を書き込む
という3ステップになる可能性があるから



527 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 12:43:39 ]
>>526
そのステップ間で割り込まれるんですか、結構分割されるものなんですね
ありがとうございました

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しか知らない癖にバカにしてたなんて
恥ずかしい理由じゃありませんよねぇ当然。






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

前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