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】 【言語】 【実行環境】 【その他突起する事項】
652 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 15:13:06 ] とりあえず何も考えず素直に作って問題が出たら詳細に 考えることにするよ。一応アロケータ的なインタフェイ ス挟んでるから後からでもなんとかなると思う。 malloc/free に時間かかってる/かかってないの判定と かは gprof 辺りで大丈夫なんだっけ?
653 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 13:30:13 ] >>652 一応gprofでも判らなくもないと思う。呼び出し回数は記録されないけどね。 使える環境なら、vtuneみたいなツールを使う方が(当然)判りやすい。
654 名前:デフォルトの名無しさん mailto:sega [2009/08/04(火) 10:34:44 ] pthreadで、デタッチ状態のスレッドをポコポコつくったりしてるとき 生成したスレッドのうち今何個生きているかを知りたいんだけど pthread_hogehoge() で何か知れるような手段用意されてたっけ?
655 名前:デフォルトの名無しさん [2009/08/04(火) 11:52:30 ] マルスレage
656 名前:デフォルトの名無しさん mailto:sage [2009/08/04(火) 12:00:52 ] 無いんじゃない?atomicなカウンタでも使えばいいじゃん。
657 名前:デフォルトの名無しさん mailto:sage [2009/08/04(火) 17:07:08 ] >>656 もしそういうカウンタがもうあるなら再車輪せずに済むかな、と。
658 名前:デフォルトの名無しさん mailto:sage [2009/08/04(火) 18:51:12 ] Linuxの話だけど、この件については他でも同じ ttp://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html A thread does not maintain a list of created threads, nor does it know the thread that created it. スレッド数だけであれば、psでスレッドの情報出すときと同じ方法でできる?
659 名前:デフォルトの名無しさん mailto:sage [2009/08/04(火) 21:20:30 ] >>658 pstreeとかのソース読んだからまあ大体のことはできるんだけど そうか、管理しないことをウリにしてんのか。仕方ないなぁ。 スレッド管理はOS任せか〜。そりゃそうだよなぁ。
660 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:09:11 ] Javaで複数のインスタンスのAというメソッドに同期をかけたい場合は、 どうすればよいのでしょうか?
661 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:52:00 ] >>660 同期は(メソッドにかけるものじゃなくて)メソッドが アクセスするリソース(メモリやディスク)にかけるものだよ。 あと「同期」はスレッド間でイベントの発生待ち&発生通知を 実現する場合に使われる単語。もしもスレッド間で (メソッドを通した)リソースへのアクセスの競合を避けるのが 目的なら、「排他制御(あるいはロック)」という単語を使うのが適切。 で、質問が(後者の)排他制御を実現する場合に関するもとすれば、 各インスタンスのメソッドAで(アクセスしたいリソースへの) 排他制御を実装するコードを単純に書けばいい、というのがレスになる。 もしも各インスタンスのクラスが同一ではないため、複数クラスで メソッドのコードを変更するのはプログラム構造が複雑になると 考えているなら、たとえば以下のようなヒントが参考になるかもしれない。 ・コールバック機構を利用して並行処理時に発生するバグを防止する japan.internet.com/developer/20050927/25.html
662 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 16:02:51 ] >>661 ご回答ありがとうございます。 プロセス起動時の初期処理用メソッド(DBからマスタを取得し、キャッシュする)に同期をかけたいと思っていました。 お返事どおり、メソッドではなく、リソース(オブジェクト)に対して、ロックをかけるのが正しいですね。 キャッシュクラスをシングルトンで実装し、同期化をさせることにします。
663 名前:デフォルトの名無しさん [2009/08/11(火) 00:33:30 ] メソッドにsynchronizedを付けると、同一インスタンスで1つのスレッドしか実行できないということですか? 複数インスタンスあれば、実行できてしまうのでしょうか?
664 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 00:50:50 ] できてしまいます
665 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 22:09:06 ] staticメソッドなら大丈夫。 synchronized(Hoge.class) とか
666 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 22:56:58 ] >>665 > staticメソッドなら大丈夫。 > synchronized(Hoge.class) とか そこまで書くならstaticメソッドじゃなくてもいいじゃん
667 名前:デフォルトの名無しさん [2009/08/16(日) 00:34:07 ] マルチスレッド環境でマスタデータをDBからとってきて、HashMapかListなどに持たせるのは 問題ないのでしょうか? 基本的にJavaプロセスを起動している間にマスタデータが変更されることはない環境です。
668 名前:デフォルトの名無しさん [2009/08/16(日) 00:34:56 ] 667です。 データを持たせるHashMapかListはクラス変数で持たせたいのですが。
669 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 00:37:29 ] 情報不足 どういう問題がありえると思ってるんだ?
670 名前:デフォルトの名無しさん [2009/08/16(日) 01:02:48 ] すみません。 HashMapとかListに数千件というマスタ情報を持たせるのがおかしくないのかという点と、 HashMapやListにデータを追加するときはロックをかけますが、データを取得するときは ロックをかけなくても問題ないかを知りたいです。
671 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 01:16:29 ] >>670 ハッシュなんてもんはメモリが許すなら数万件程度は入る事を前提で作るんだが
672 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 01:37:04 ] >>670 (すでに別の方法で同期済み等で) 追加と取得が同時には起きないと判っているなら、取得同士の間のロックは不要 追加と取得が同時に起きるかもしれないなら、取得にもロックは必要
673 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 06:35:50 ] 通信とかどうでもいいから普通にマルチコアに特化したライブラリってないのさ?
674 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 08:59:53 ] つintel TBB
675 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 09:49:44 ] >>673 スレッド間通信が無くても役に立つマルチスレッドアプリとは何者?
676 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 21:13:28 ] ブルートフォースとか
677 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 10:00:56 ] >>675 サーバとか
678 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 12:29:42 ] pthreadでPSで表示したときのスレッド名を変える方法ってありますか?
679 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 11:14:51 ] ないんじゃない?
680 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 19:59:12 ] PR_SET_NAMEすればいいんじゃない?
681 名前:デフォルトの名無しさん mailto:sage [2009/08/28(金) 15:32:43 ] Cでマルチスレッドのプログラミングで ふたつのスレッドの時間的な同期をとって 同時に同じファイルを開くにはどのように書けばよいですか
682 名前:デフォルトの名無しさん mailto:sage [2009/08/28(金) 16:04:42 ] >>681 そんなことできるんですか
683 名前:デフォルトの名無しさん mailto:sage [2009/08/28(金) 16:11:59 ] >>681 その発想はなかった
684 名前:デフォルトの名無しさん mailto:sage [2009/08/28(金) 16:12:05 ] >>680 ありがとう。とても役に立った。
685 名前:682 mailto:sage [2009/08/28(金) 16:18:17 ] >>681 2つのスレッドから共通のモジュールを介してファイルにアクセスするようにしてはどうですか 2つのスレッドからは1つのファイルを開いているように見せつつ, そのアクセス(読み書き)先の実体であるモジュールの中で排他制御するんです
686 名前:デフォルトの名無しさん mailto:sage [2009/08/28(金) 17:14:56 ] 対象OSにどういった同期手段が用意されているかによる どの程度同時性を求めるかにもよるし、それはつまり何のために同時でなきゃならないのかにもよる
687 名前:デフォルトの名無しさん mailto:sage [2009/08/28(金) 20:01:11 ] >>681 日本語の文章がちゃんと書けない人はプログラミングも出来ない。 by 竹内
688 名前:デフォルトの名無しさん mailto:sage [2009/08/28(金) 20:10:31 ] >>686 これ、日本語が致命的に下手なだけで、要点は ただ排他制御したいってことだろ
689 名前:デフォルトの名無しさん mailto:sage [2009/08/28(金) 20:20:01 ] 時間的な同期を取るってんだから、「同時」の意味が違うかもしれんぞ
690 名前:デフォルトの名無しさん mailto:sage [2009/08/28(金) 22:58:07 ] 日本語が下手ではなく、 頭の中で思考の同期が取れてないのでは。
691 名前:デフォルトの名無しさん mailto:sage [2009/08/29(土) 02:53:56 ] 排他制御しないって意味かもしれんぞ
692 名前:デフォルトの名無しさん mailto:sage [2009/08/29(土) 06:04:35 ] まぁ、>>681 がマルチスレッドでプログラミングすべきでないことだけは間違いないな…
693 名前:デフォルトの名無しさん mailto:sage [2009/08/29(土) 08:12:32 ] >>681 同時に開く保証はできない。 「ほぼ同じ頃に開くことができるかもしれない」が限度
694 名前:デフォルトの名無しさん mailto:sage [2009/08/29(土) 08:32:21 ] 2スレッドをイベント待ちにしてから、同時に起こすのかと思った。
695 名前:デフォルトの名無しさん mailto:sage [2009/08/29(土) 09:00:31 ] マルチスレッドプログラムでのよくある落とし穴をまとめたサイトってどこかにない?
696 名前:デフォルトの名無しさん mailto:sage [2009/08/29(土) 09:36:25 ] >>695 ttp://www.itmedia.co.jp/enterprise/articles/0503/23/news086.html まんまのがあるではないか。 >Windowsプログラマーでスレッドをいちども使ったことがない人はいないだろう。 一瞬それはないだろうと思ったがスレッド使わなきゃWindowsのプログラムは作れぬなw
697 名前:デフォルトの名無しさん mailto:sage [2009/08/29(土) 11:12:44 ] シングルはあるよな
698 名前:デフォルトの名無しさん mailto:sage [2009/08/29(土) 11:14:07 ] まぁ「プログラムなんてとりあえず動けばいいや」と考えている奴は大抵マルチスレッド関連でバグ出してハマるしな。
699 名前:デフォルトの名無しさん mailto:sage [2009/08/29(土) 11:19:51 ] >>698 そういうのは未だ救いようがあるが自分の痛さに気づいていない プログラマーは救いようが無い。
700 名前:696 mailto:sage [2009/08/29(土) 11:39:02 ] よく見たらゴミ記事であるな。 参考にしないほうが良い。スマヌ Orz
701 名前:696 mailto:sage [2009/08/29(土) 11:47:41 ] ゴミ記事って言うのは酷すぎた。。 前提知識のない初心者が見ると混乱すると言うのが正しい。
702 名前:デフォルトの名無しさん mailto:sage [2009/08/29(土) 18:11:28 ] 冒頭の四行くらいで日本語も問題切り分けも怪しく感じたから流し読みしたけど どうでもよさそうな記事だった
703 名前:デフォルトの名無しさん mailto:sage [2009/08/29(土) 21:52:57 ] シングルトン実装から始まって愚駄ぐだになって終わってると。
704 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 10:25:00 ] >>696 の記事の二重チェックロックなんだけど if (_Value == null) { lock (ValueLock) { if (_Value == null) { A temp = new A(); Thread.MemoryBarrier(); _Value = temp; } } } Return _Value; これだと_Valueが更新される前にlockから抜ける可能性ない? Thread.MemoryBarrier()するのは_Value = temp;の後じゃないの?
705 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 13:05:55 ] _Valueの代入はlockの中にあるから、_Valueが更新される前にlockを抜けるわけはない 第2のスレッドがやってきて外側のif(_Value==null)を見たときに、 もし_Valueがまだnullならlockに引っかかるから最初のスレッドが更新を完全に終えるまで待たされるので問題ない (lock/unlock自体がメモリバリアになる) 問題は_Valueがすでにnullでなかった場合、_ Valueは新しいオブジェクトを指しているけれども_Valueの中のフィールドはまだ更新されてない、という事態が起きうる (メモリの書き込み順序は勝手に並び替えられるので) それを防ぐためにメモリバリアを挟んで、_Valueが更新されるよりも前に_Valueの中身が更新されることを保証している
706 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 13:28:19 ] _Valueが更新されるよりも前に_Valueが参照されないことを保証している
707 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 13:35:51 ] _Valueへのアクセスは同期されてないから、lock中で_Valueが更新された直後から 他スレッドからAが使えるようになる。 でも Aの構築 _Valueの更新 Aの構築の結果がAのフィールドに反映される となる可能性があり、不完全な状態のAが使われる可能性がある。 だからAをnewした後にThread.MemoryBarrier()してから_Valueに代入する。 _Valueへの代入はlockを抜ける段階で保証される。 ということか。 勉強になった、ありがとう。
708 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 13:39:37 ] 一応はっておく www.ibm.com/developerworks/jp/java/library/j-dcl/
709 名前:デフォルトの名無しさん [2009/09/01(火) 20:32:30 ] クアッドコアを使った並列処理を MFCでのマルチスレッドでやろうとしておりますが、 シングルコアのときと同じマルチスレッドのプログラムでも 4つのコアを利用した並列処理になるんでしょうか?
710 名前:デフォルトの名無しさん mailto:sage [2009/09/01(火) 20:34:22 ] なるよ
711 名前:デフォルトの名無しさん [2009/09/01(火) 20:38:55 ] >>710 そうっすか!ならよかったです。
712 名前:デフォルトの名無しさん mailto:sage [2009/09/01(火) 21:08:29 ] erlang
713 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 00:40:31 ] >>709 MFCには詳しくないけどシングルコアで問題なく動いてたMTセーフのつもりの プログラムがマルチコアにもってくと異常動作することはそれなりにあるん じゃないの?int型への代入・参照を非同期でやってたりするプログラムだと。
714 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 01:07:14 ] >>713 何故int? 64bit整数ならわからんでもないけど。
715 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 01:11:11 ] つーかそんなことを質問してるわけじゃねーし。 言ってみたかっただけだろ。
716 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 01:18:05 ] intでもread-modify-writeはatomicじゃないぞx86は(も)
717 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 01:18:42 ] >>709 なる。OSネイティブのスレッドは、明示的に指定しない限り、複数のコアに分散される。 とは言え、排他制御が適切でないと、各コアを有効に利用できないけど。
718 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 01:27:46 ] >>716 いや、それだったらそもそもデータ型問わんのでは。
719 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 01:33:30 ] いやいや、おまいら、それ以前にそれはスレッドセーフと呼ばないのでは。
720 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 02:19:59 ] >>718 64bitなら、と言ってるから、マシンワードならアトミックと思ってるのかなと思った
721 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 03:38:51 ] volatile
722 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 06:06:12 ] volatileがどうかしたか?
723 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 09:42:27 ] vottakle
724 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 13:14:01 ] 明白な答えが、ここで出せるわけ無いんだから。 あなたが欲しいのは同意なんじゃないの?だから荒れる。
725 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 13:37:33 ] >>724 独り言が言いたいだけだ、とかでないなら 最低限アンカーくらい書いたら?
726 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 13:55:09 ] >>725 ごめんめっちゃ誤爆
727 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 13:57:38 ] ∧∧ ヽ(・ω・)/ ズコー \(.\ ノ 、ハ,,、  ̄  ̄
728 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 14:27:31 ] >>696 いまひとつ怪しい記事だな。 だいたい今の.NETじゃ前提が変わりすぎてて、役にたたないどころか害のが多い気がするし。
729 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 21:22:08 ] >>720 64bitを持ち出したのは、32bitマシン(あるいは32bitモード)だと、単一の書き込み/読み出しでも競合すると値が壊れる可能性があるから。 (最初の32bitが書き込み前の、次の32bitが書き込み後の値を読み出す可能性がある) マシンワード以下なら、順序が入れ替わることはあっても値が壊れることはないと思ってるんだけど、それもあてにならない? あと、x86系だと、ワード境界をまたぐ読み書きがどうなるかがよくわからない。
730 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 21:40:02 ] P6以降はキャッシュアラインドなマシンワードのreadやwriteはアトミックだよ read-modify-writeはLOCK#がassertされないとアトミックじゃないよ xchg命令は昔からLOCK#がassertされる仕様だからアトミックだよ コンパイラも含めた挙動はこの辺も参考にするといいよ msdn.microsoft.com/ja-jp/library/bb310595 (VS.85).aspx
731 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 21:48:23 ] ttp://www.intel.com/Assets/PDF/manual/253668.pdf ここの 8.1 LOCKED ATOMIC OPERATIONS を嫁
732 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 22:01:55 ] >>729 >マシンワード以下なら、順序が入れ替わることはあっても値が壊れることはないと思ってるんだけど、それもあてにならない? w
733 名前:デフォルトの名無しさん mailto:sage [2009/09/03(木) 00:09:10 ] The Art of Multiprocessor Programming 糞本だなぁ
734 名前:デフォルトの名無しさん mailto:sage [2009/09/03(木) 03:59:45 ] volatile
735 名前:デフォルトの名無しさん mailto:sage [2009/09/03(木) 05:34:09 ] volatile変数へのアクセスのアトミック性は、non-volatileな変数へのアクセスと同じ だから、この流れにvolatileは何の関係も無いよ
736 名前:デフォルトの名無しさん mailto:sage [2009/09/03(木) 09:27:34 ] >>706 読み取り側ではメモリバリアはいらないの?
737 名前:デフォルトの名無しさん mailto:sage [2009/09/03(木) 10:14:24 ] _Valueの値を読み込む前にその指す先の値を読み込むのは不可能だから メモリバリアがなくても読み込み順序は入れ替わらないはずで要らない・・・んじゃないかなたぶん
738 名前:デフォルトの名無しさん mailto:sage [2009/09/03(木) 15:09:34 ] >>737 >_Valueの値を読み込む前にその指す先の値を読み込むのは不可能だから >メモリバリアがなくても読み込み順序は入れ替わらないはずで要らない それが成り立たないアーキテクチャもあるんだな。 www.cs.umd.edu/~pugh/java/memoryModel/AlphaReordering.html
739 名前:デフォルトの名無しさん mailto:sage [2009/09/03(木) 15:31:35 ] volatileの話をするときは、C/C++なのかJava/C#(CLI)なのかをはっきりさせろ。 それぞれのvolatileの意味はまるっきり別なんだからな。
740 名前:デフォルトの名無しさん mailto:sage [2009/09/03(木) 15:59:30 ] そうか、やっぱりだめか 例の記事は今見直したらvolatileが付いてるな なるほど
741 名前:デフォルトの名無しさん mailto:sage [2009/09/03(木) 16:18:16 ] それはメモりバリアかvolatileどっちかって話だから意味ないよ
742 名前:デフォルトの名無しさん mailto:sage [2009/09/03(木) 16:36:48 ] そろそろvolatileについて一言いっておくか ttp://d.hatena.ne.jp/bsdhouse/20090720/1248085754
743 名前:デフォルトの名無しさん mailto:sage [2009/09/03(木) 22:04:04 ] C++っていつまでAtomicIntegerとかないわけ? ふざけてないか?いい加減にしろ
744 名前:デフォルトの名無しさん mailto:sage [2009/09/03(木) 22:06:40 ] と言われても今年決まる新標準には採用されてるし 一企業や一個人に独占されてる言語と比べるなよ
745 名前:デフォルトの名無しさん mailto:sage [2009/09/03(木) 22:10:45 ] >>744 C++0xは2012年まで延期でしょ 今すごい揉めてるでしょ
746 名前:デフォルトの名無しさん mailto:sage [2009/09/03(木) 22:13:31 ] つーかC++使うならそのくらいはライブラリかAPIか自力で何とかできないと 結局他でつまづく
747 名前:デフォルトの名無しさん mailto:sage [2009/09/03(木) 22:23:59 ] ちょっと来週あたり C++のatomic実装投下するから誰か100% 厳密に正しいか判断できる人いますか?
748 名前:デフォルトの名無しさん mailto:sage [2009/09/03(木) 23:38:00 ] 投下してから聞け。
749 名前:デフォルトの名無しさん mailto:sage [2009/09/04(金) 00:20:53 ] 現行C++ + Boost + TBBで組んでおけば、C++0xの時代になっても スムーズに移行できるんじゃないかな
750 名前:デフォルトの名無しさん mailto:sage [2009/09/04(金) 22:04:46 ] 最近はC++の仕事が減ってC#とCばっかりになったお
751 名前:デフォルトの名無しさん mailto:sage [2009/09/04(金) 23:55:21 ] blueroad.sakura.ne.jp/entry/20070815.php
752 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 00:54:22 ] gccだとvolatileは付けても付けなくても 効果ないんだね