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/
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 ] だめだこりゃ
101 名前:デフォルトの名無しさん mailto:sage [2006/12/09(土) 01:14:01 ] <script> function Test(){ while(1){} } </script> ... <span onclick="Test()">Hello World!</span> でブラウザ死ぬけど?
102 名前:デフォルトの名無しさん mailto:sage [2006/12/09(土) 01:18:19 ] ?
103 名前:デフォルトの名無しさん mailto:sage [2006/12/09(土) 01:28:07 ] どのブラウザで? つかブラウザネタをここでやるのか・・・ヤだなあ
104 名前:デフォルトの名無しさん mailto:sage [2006/12/09(土) 04:50:27 ] ここはやっぱり伝家の宝刀 volatileネタを持ち出して本来のスレの荒れ方に戻そうよ。
105 名前:デフォルトの名無しさん mailto:sage [2006/12/11(月) 10:38:50 ] Intel C++ Compiler for LinuxでOpenMPを使った並列化をやっているのですが、Intel Thread ProfilerにはLinux版が存在しないので、 暗黙的/明示的なバリア, ループの分割, critical構文等のオーバーヘッドや負荷の不均衡が検出出来ず、いまいちパフォーマンスが伸び悩んでおります。 このような問題を解決できるLinux用のツールは存在するのでしょうか? それともWindowsに移行するという選択肢しかないのでしょうか? なんだかレベルの低い質問で慙愧に堪えないのですが、もし誘導や解答をいただければ嬉しいです。 Intel Thread Profiler www.intel.com/cd/software/products/ijkk/jpn/threading/310854.htm
106 名前:デフォルトの名無しさん mailto:sage [2006/12/11(月) 18:47:00 ] 一昔前だったらまともなスレッドプログラミングしたけりゃSolaris使え、で 片付けられてたような気がするけど私も興味あるので識者の降臨を待つ。 Valgrind(Helgrinid)の他にLinuxで実用に耐えるツールはあるのかな、と。
107 名前:デフォルトの名無しさん mailto:sage [2006/12/11(月) 19:06:34 ] とりあえず脳味噌ぶら〜んから適当に検索。 ttp://www.nbrains.net/php/pukiwiki/index.php?link%BD%B8%2F%B3%AB%C8%AF%B4%C4%B6%AD%B7%CF#Debugger ttp://www.nbrains.net/php/pukiwiki/index.php?link%BD%B8%2F%B3%AB%C8%AF%CA%E4%BD%F5%A5%C4%A1%BC%A5%EB%B7%CF#Profiler
108 名前:105 mailto:sage [2006/12/11(月) 22:40:37 ] >>106-107 御解答有難う御座います。 わざわざ検索していただいたのに申し訳ないのですが、ちょっとその中には無いようですorz 凹んでいるだけでは何にもならないので、とりあえず"OpenMP"でググって片っ端から有望そうな所を覗いてみました。 結果、Omni OpenMP Compilerにtlogviewなるツールがあることがわかりました。 phase.hpcc.jp/Omni/openmp-tutorial/sld049.htm これを使えば、「iccでOpenMPを使った限界までのパフォーマンスチューニング」は難しそうですが、 「自分のコードの駄目なところ(計算粒度、ロードバランス等)を効率的に見つける」ことはできそうな感じです。 これを使って駄目だったらWinへの移行も検討してみようと思います。
109 名前:デフォルトの名無しさん mailto:sage [2006/12/11(月) 22:42:55 ] SolarisがN:Mスレッドモデルをやめたのは効率が悪かったから?
110 名前:デフォルトの名無しさん mailto:sage [2006/12/11(月) 23:45:55 ] アプリが1:1モデルを前提に作られる(チューンされる)ようになったから。 アプリといってもぶっちゃけoracleだが。 SolarisのためだけにN:M用チューンするのは時間の無駄だからね。 これを効率というならば効率だね。
111 名前:デフォルトの名無しさん mailto:sage [2006/12/20(水) 09:58:49 ] I/.O主体の仕事は前提とかチューンってこととは関係なく、 1:1の方が効率がいい場合が多いでしょ。 CPUを明け渡すのがカーネル内であることが多いから。 だからエンタープライズが主戦場のSolarisでは当然のことかと。
112 名前:デフォルトの名無しさん mailto:sage [2006/12/20(水) 10:23:41 ] OSが1:1ばかりになったというのもあるよ
113 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 01:18:13 ] そういうことは関係ない。 ちゃんと選んでやっている。
114 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 01:28:43 ] M:Nはシグナルの動きが1:1のときと全く同じにはならない。 両モードでのデバッグや検証コストを掛けられない。 もう一つは>>112 のとおり。 OS屋のオナニーで仕様が決まる時代は終わった。
115 名前:デフォルトの名無しさん mailto:sage [2006/12/22(金) 22:55:26 ] マルチスレッドのデバッグではまっています (私が作ったんじゃないのですが) beginthreadが50個、EnterCriticaSectionが40個くらい、 スレッド最大200個くらいが動くとんでもないシステムです。 (もちろん満足に動いてないです) とりあえず、下記の方針でソースをチェックしようと思いますが、 他にもありますでしょうか? 1 InitializeCriticalSection()以前の行に、_beginthreadを呼び出す関数に入ってないか 2 スタティック変数、グローバル変数にEnterCriticalSecitonなしで書き込みを 行ってないか 3 newで作ったオブジェクトのポインタを複数のスレッドで参照してないか
116 名前:デフォルトの名無しさん mailto:sage [2006/12/22(金) 23:13:58 ] >>115 問題を正しく特定できてるのか?
117 名前:デフォルトの名無しさん mailto:sage [2006/12/23(土) 00:10:24 ] >>116 とにかくアクセス違反で落ちたり、 const変数が書き換わったりするみたいです もちろんマルチスレッドが原因かは特定できないのですが、 (ただ、ソースを見ると明らかにマルチスレッドを扱いきれてないです) 今、メモリ周りとかいろんな方面から数人で見ています。 もちろんデバッガ使ったりログ吐いたりはしています。
118 名前:デフォルトの名無しさん mailto:sage [2006/12/23(土) 01:17:19 ] >>115 あと、EnterCriticalSectionへの再帰がないか。 同一スレッドだと、EnterCriticalSectionの挙動が変わるから注意。
119 名前:デフォルトの名無しさん mailto:sage [2006/12/23(土) 03:03:16 ] どれくらいのスパゲッティ度かにもよるけども 仮想的なdbを用意して、データへのアクセスは必ずdb経由にするのも手だぞ。 (ポインタは渡さない、必ず生データのやり取りにする) 少なくとも知らない間に書き換わることはなくなる。 パフォーマンスは落ちるけどな。
120 名前:デフォルトの名無しさん mailto:sage [2006/12/23(土) 09:02:59 ] >>118 なるほど、それは知りませんでした。ありがトン!!!!! >>119 うーん、なるほど。それも覚えておきます。ありがトン!!! とりあえず、ある程度安定してきたら、 再設計など検討するらしいです。
121 名前:デフォルトの名無しさん mailto:sage [2006/12/31(日) 12:29:32 ] winapiでいうところのCrateEvent(), WatiForSingleObject(), SetEvent(), ResetEvent() に該当する関数ってPOSIXでいうとどんなものになるんでしょうか? mutexは双方にあって別にいいんですが、待機オブジェクトがなくて困っています。
122 名前:デフォルトの名無しさん mailto:sage [2006/12/31(日) 13:24:29 ] >>121 condition
123 名前:デフォルトの名無しさん mailto:sage [2007/01/04(木) 21:52:54 ] 新年明けましておめでとうございます。 本年も、マルチスレッドプログラミング相談室 その5にご健勝あれ。
124 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 21:53:22 ] 本年の相談は終了いたしました。
125 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 23:09:40 ] >>123 うむ御旗楯無もご照覧あれ
126 名前:デフォルトの名無しさん [2007/01/08(月) 22:40:26 ] 実験用にものすごく単純なマルチスレッドの http サーバを組んでみたのだけど、 コードだけ見るとロックするようなコードじゃないのに、長時間ストップしたまま になることがある。(いちおう、しばらく待つと再開する) listen() 状態のソケット作って、accept() したら pthread_create() してループ。 子スレッドのほうでは GET (path) HTTP/1.1 を待って、そのファイルを読んで返すだけ。 という単純なやつなのだけど、毎秒100リクエスト以上くらい httperf で送ってやると、 必要以上に処理がストップする。 (netstat -a すると一つも ESTABLISHED になっていない状態で数秒間とまっている) カーネルは NUMA を無効にした以外は特にいじっていない Linux 2.6.15.7/x86_64 スレッドとネットワークをがんがんいじっている人には自明な問題っぽいけど、 どの辺に原因があって、どういじれば、せめて無駄なストップをしなくなるのでしょうか。
127 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 11:26:21 ] >>126 親スレッドでpthread_joinなり、pthread_detachしてる? してないと、終了コード保持のため、子スレッドが終了せず、プロセスのスレッド数限界に 引っかかるかもしれん。
128 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 17:27:41 ] いちいちaccept毎にthreadを作成・破棄というのが良くない予感
129 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 19:18:57 ] >>126 子スレッドはちゃんjとソケットから全部読んでから closeするか、shutdown するかしてますか?
130 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 21:36:43 ] FreeBSDでコンパイル&実行するとそういう問題は起きない
131 名前:デフォルトの名無しさん [2007/01/16(火) 22:08:14 ] _endthreadでスレッド終了すると、デストラクタが走りません。 無理やり{}で囲んでデストラクタを走らせてますが、 標準的な方法ってありますか?
132 名前:デフォルトの名無しさん mailto:sage [2007/01/16(火) 22:17:40 ] _beginthreadは使わない _endthreadexは呼ばない
133 名前:デフォルトの名無しさん [2007/01/16(火) 22:29:22 ] >>132 _beginthreadexを使い、スレッド終了時に_endthreadexを呼ばないで単にreturnするだけということでしょうか??
134 名前:126 [2007/01/16(火) 23:37:42 ] ISP が割り当てるアドレスの周辺が 2ch にブロックされて書き込めなかった…。 スレッドとは関係なく、プロセス (もしくはある listen 状態のソケット) あたりの同時接続数が一定値を超えると何かあるのかも、とか推測中。 >>127 pthread_detach() してますね。 >>128 待機スレッドを用意しておくとかすると改善するのかな。 >>129 あ、読み残しがある可能性はあるかも。 けど、そういう原因ならリクエスト頻度を下げても同様の問題が起こり そうなものだが、 50リクエスト/秒くらいにすると起こらなくなる。 >>130 ソケット一般の問題じゃなくて Linux 特有の問題か…。
135 名前:126 [2007/01/16(火) 23:39:44 ] あ、とりあえず接続数を減らして、一接続あたりの転送量を増やすことで 目的には事足りるので、とりあえずそのようにしてやっている。 なぜストップするのか、に対する興味はあるのでまだ調べているけど。
136 名前:デフォルトの名無しさん mailto:sage [2007/01/17(水) 18:05:57 ] tcp_fin_timeout の話かなぁ 再利用できるポートが足りなくなって、待ちになってるとか
137 名前:126 [2007/01/17(水) 22:48:11 ] >>136 あ、それビンゴかも。 Apache に細工して、一度ソケットを (勝手な手順で) 作り直してアクセスすると、 同様の停止現象が起こった調査結果が手元にある。 ソケットに何かの値を設定すると停止現象を回避できるのかなあ (Apache は標準でそれをやっているけど、自分の勝手な手順ではやっていないのが原因かなあ) と想像していた。 setsockopt() で *ソケットごとに* この tcp_fin_timeout を 設定できるらしいので、この値がそれかもしれない。 これから Apache のソースを読んでみるつもり。 thanks.
138 名前:デフォルトの名無しさん mailto:sage [2007/01/17(水) 23:11:05 ] >>134 >あ、読み残しがある可能性はあるかも。 ソケットは、両端で正しく ・全部読む (read で 0 が戻るまで) ・shutdown する のどちらかをしないと、close しても FIN_WAIT_2 だか何だか長めに待たされるステートに なっちゃっうんじゃ無かったかなあ。netstat してみれば即わかるけど。 ttp://www.kt.rim.or.jp/~ksk/wskfaq-ja/articles/debugging-tcp.html の mini FAQ の 5 を参照。
139 名前:デフォルトの名無しさん mailto:sage [2007/01/19(金) 12:09:34 ] スレッドがシグナル状態になったあとに新たにスレッドを生成したいのですが、 そのスレッドのハンドルはクローズした方が良いのでしょうか? シグナル状態になったらスレッドのスタックは解除されるようですが。 上書きしてCreateThreadをしたらメモリリークしたりしますか? Win32APIです。
140 名前:デフォルトの名無しさん mailto:sage [2007/01/19(金) 12:36:33 ] クローズした方が良い
141 名前:デフォルトの名無しさん mailto:sage [2007/01/19(金) 23:23:03 ] ハンドルってただのポインタだから、 上書きしてもポインタ先が変わるだけ リソースは残ったままだとおもう
142 名前:デフォルトの名無しさん mailto:sage [2007/01/19(金) 23:30:08 ] スレッドが終了してシグナル状態になったんであれば、 スタックとかコンテキストは解放されると思うけど ハンドルは残ったままじゃないか?戻り値を受け取るためにハンドルが必要だし。 といっても、ハンドルごとき残ったままでもたいしたことは無い。 (少々のリソース漏れはたいしたことないなんて言ってる奴のコードは信用ならんけど)
143 名前:デフォルトの名無しさん mailto:sage [2007/01/20(土) 01:01:12 ] 試してみた。 #include <stdio.h> #include <windows.h> static DWORD WINAPI func(LPVOID p) { printf("thread %d\n", (int)p); return 0; } int main() { int i; for(i = 0; ; i++) { if (::CreateThread(0, 0, func, (LPVOID)i, 0, 0) == 0) break; } ::getchar(); printf("i = %d error code %u\n", i, ::GetLastError()); ::getchar(); } VS2005のデバッガ上だと2000超えたあたりでERROR_NOT_ENOUGH_MEMORYで止まる。 デバッガ外でやってみたら10万超えても終わらず、 なぜかipoint32.exeにアプリケーションエラーが出たりして怖くなったのでやめた。
144 名前:デフォルトの名無しさん mailto:sage [2007/01/21(日) 13:15:48 ] メモリリークか 何もかも(ry
145 名前:デフォルトの名無しさん mailto:sage [2007/01/21(日) 15:01:28 ] func のスレッド優先度、上げといた方がいいのでは?
146 名前:143 mailto:sage [2007/01/22(月) 08:17:30 ] あーそっか。あくまでハンドルのみのテストだったらちゃんとWaitForSingleObjectで待たなきゃいかんわな。 しかしWaitForSingleObjectしたのにわざわざCloseHandleしないでおく理由って考えにくいが。
147 名前: ◆0uxK91AxII mailto:sage [2007/01/22(月) 19:48:12 ] CreateThreadで走らせたthreadでは、CRTのfunctionを呼ぶべきではない。
148 名前:デフォルトの名無しさん mailto:sage [2007/01/22(月) 20:37:55 ] メモリーリーク?
149 名前:デフォルトの名無しさん mailto:sage [2007/01/23(火) 00:11:40 ] 再入?
150 名前:デフォルトの名無しさん mailto:sage [2007/01/23(火) 01:46:25 ] ttp://d.hatena.ne.jp/NyaRuRu/20070113/ こんな話もあった。
151 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 19:22:25 ] とりあえずCRTは動的リンクしておけと
152 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 23:38:46 ] 2つプロセスで共有メモリのデータを共有する サンプルってどこにあるのですか?pthread Linuxのやつを探しています。
153 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 09:49:27 ] スレッド関係ないから。APUE買え。
154 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 10:21:08 ] VS2005って標準でOpenMP使えたんだな
155 名前:デフォルトの名無しさん [2007/02/18(日) 16:38:41 ] ここで俺がひとまずここまでのレスをまとめる。 マルチスレッドは ム ズ カ ス ィ
156 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 20:05:23 ] >>152 だまってmmapすればいいんでないの?
157 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 21:12:05 ] >>155 お前にこの言葉を授けよう 「糞スレ立てるな」
158 名前:デフォルトの名無しさん [2007/02/20(火) 23:27:34 ] ファイアーモックス!
159 名前:デフォルトの名無しさん [2007/02/24(土) 10:27:57 ] 質問なんですがマルチスレッドでは同じ変数のアドレスの場所を if文等で見に行くだけならぶつかることはないですか?
160 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 10:34:52 ] 読むだけなら問題ないと思。 最適化には気をつける必要があるが。
161 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 10:40:11 ] FAQだな。 読むだけなら排他不要。 ただしvolatileを忘れずに。 つーかvolatile最強。
162 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 12:17:45 ] >>159-161 別スレッドからの書き込みも考慮するならロックなどによる同期が必要。 volatile はネタだよね?
163 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 12:46:43 ] 他スレッドが変更するメモリを読むなら必要でしょ。
164 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 13:02:15 ] おっ久々にvolatileが来たか。わくわく。
165 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 13:16:54 ] >>162 writerが一人、readerが複数ならロックする必要ないよ。
166 名前:デフォルトの名無しさん [2007/02/24(土) 13:28:17 ] >>165 あたまだいじょうぶか
167 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 13:28:40 ] 意地悪しないで教えてやれよって。 JavaやC#でのvolatileはその解釈であってる。 C/C++のvolatileは割り込みしか想定していないので、マルチスレッドでの動作は不定。 ただしシングルCPUでのマルチスレッドは割り込み(タイマー割り込み)で実現されているのでたまたま動作する。 >>165 変数がアトミックじゃない場合、例えば32bitCPUで64Bitの変数にアクセスする場合などは、 書いてる最中に読み込みされると半分しか書き換わってない状態を読み込む可能性がある。
168 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 13:34:19 ] シングルCPUのマルチスレッドだと動いてしまうことが多いからね。それで合ってると思い込んでしまうのだよ。 CPUキャッシュの問題は難解だね。 さらにウィークメモリモデルともなるとさすがについて行けんorz
169 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 13:43:29 ] 書き込み側が明示的に、アトミック書き込み命令を出せばいいんでね?
170 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 16:37:41 ] 読み込みもアトミックじゃねーと意味ね-よ
171 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 16:41:40 ] 要は、アトミックに読み込めることが期待できるint程度のデータ以外はなんらかの排他が必要ということでよろしいか。 #いや、intでも排他するべきなのかもし煉瓦。
172 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 18:52:05 ] >>171 > #いや、intでも排他するべきなのかもし煉瓦。 というのが>>168 だね マルチCPU環境の排他はバス設計の影響もうけるから 環境を明記しないと言及不能やね
173 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 20:21:33 ] >170 書き込みがアトミックに出来るのに、読み込みがアトミックに出来ない、なんて 変態CPUが現存するのか?そういうCPUではロックをどう実装するんだろ?
174 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 23:09:38 ] キャッシュラインをまたぐと面白いよねー
175 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 01:29:43 ] >書き込みがアトミックに出来るのに、読み込みがアトミックに出来ない、なんて >変態CPUが現存するのか? >書き込み側が明示的に、アトミック書き込み命令を出せばいいんでね? ↓ >読み込みもアトミックじゃねーと意味ね-よ だれも読み込みがアトミックにできないなんて言っとらんわ。
176 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 04:26:18 ] どっちかというと >ねーと → ー >ね-よ → - この不整合の方が気になるな どちらかがアトミックじゃないのかもしれない
177 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 05:04:12 ] こういう意味不明な誤変換はUNIX発のFEPwに多いな
178 名前:デフォルトの名無しさん [2007/02/25(日) 15:04:49 ] volatile方式を知られては困る奴が必死だなw
179 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 15:39:00 ] d.hatena.ne.jp/yupo5656/20040618 volatile無意味説
180 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 17:24:44 ] そのリンク先にしても、なぜvolatileでは駄目なのかが書いてなくて 「お母さんが駄目って言ってたから」レベルの話しか書いてないな。 そして、そのURLを貼る>>179 も同様。
181 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 17:50:33 ] なぜ volatile で済むと言えるのか、書くかリンク貼るかしてみやがれ。
182 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 18:59:13 ] volatile - Multithreaded Programmer's Best Friend www.ddj.com/dept/cpp/184403766
183 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 19:32:05 ] >>182 もしかして >>181 へのレスのつもりなのか?
184 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 19:41:48 ] そんなわけないだろ。逆だ。 "Paradoxically, it's worse to use volatile directly with built-ins, in spite of the fact that initially this was the usage intent of volatile!"
185 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 20:20:26 ] >>182 これって >スレッドセーフなメソッドにはvolatileをつける。 という提案だよな?まだ実装はないと思ったのだが。
186 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 22:48:59 ] volatileを実装してるJVMってほとんど無いんじゃなかったっけ
187 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 23:35:03 ] >>185 実装ってどういうこと?標準 C++ コンパイラがあれば使える手法に見えるんだけど。
188 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 01:31:15 ] C とか C++ の volatile って I/O レジスタとか, 割り込み同期変数とかを, オ プティマイザがレジスタキャッシュしないように指示するために導入された物で, バリア同期命令とか生成する処理系は皆無のような気がするが... 俺の認識が古くって, バリア同期とか生成してくれる処理系が既にあるんだった ら先にあやまっとく
189 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 05:30:32 ] 何故「volatileで済む用途」のケースにメモリバリアがどうのという話になるのかわからんね。 簡単な例で言えば (タイマ割り込み等で更新される)カウンタを読む場合とか 複数スレッドで値を読み取るとしても、ロックする必要なんか無い。 たとえ1ns更新が遅れたって、問題が出ることは無い(問題が出るようなら、設計がおかしい)。 え、更新時の再入を考慮しろって? そういうのを「設計」と言うんだろうに。
190 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 06:29:25 ] >>182 int func() const { } はよく使うが、int func() volatile { } を実際に使ってる例ははじめてみる。 ただその記事のLockingPtrは func() volatile の仕組みだけ拝借して実際の排他はmutexでやってるようだ。 よく理解できない部分もあるがvolatileしておいてconst_castで限定的に穴あけてるのだろうか。 このスレで問題になるのはそこではなくて、 記事の最初と2番目のコードで while (!flag_) のflagがvolatileだけでいいのか、 同期機構を使わなくてはいけないかのポイントだと思う。
191 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 07:52:54 ] >>188 volatileで済むってのは、コヒーレントキャッシュを持っている環境で アトミックに読み書きできるサイズ限定だから、メモリバリアは関係ないよ。 2つ以上の変数に依存関係があったら、volatileだけでは無理。 一般論の話をすれば、キャッシュの一貫性を保障しない環境もあるから int程度でもvolatileでは駄目という話になるが。
192 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 09:15:17 ] ちゃんと読めてないが、>>182 って、コンパイラの実装とか関係なくて constみたいな印としてvolatileを使ってみようっていう提案だよね?