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/
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を使ってみようっていう提案だよね?
193 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 19:26:29 ] volatileの仕様は処理系定義だとあれほど言ってるのに… 処理系を指定しないでvolatileについて語れることはない
194 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 21:25:32 ] 処理系どころか言語すら指定されてない気がするのは 漏れだけではないはずだ
195 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 00:02:42 ] とりあえず、volatileをCの最適化阻害だけと仮定して、 >>191 一貫性を保証しなかったとしても、それはあくまで保証の話。 いつまで経っても同期されないような腐ったCPUってあるの? あったとしたら処理系としてBrokenだよなぁ・・・。 >>193 ここに書いてる人のほとんどは処理系依存だなんて承知の上でしょ? とりあえず、intだとしても同期やメモリーバリアは必要か? って問いはもう少しレベル分けした方がいいと思う。 1. 読み込みに依存した書き込み(read-modify-write) ⇒ 同期もしくはメモリーバリアを含んだCASが必要。 2. 読み込みに依存しないが、確実に更新を見る必要がある ⇒ OoOを回避するために、少なくともメモリーバリアは必要。 3. 読み込みに依存しないし、更新は近いうちに反映されればよい ⇒ volatileでレジスタへの張り付きを阻害するだけで問題なし? >>189 の「更新が遅れても構わない」は3になると思うんだが。
196 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 01:19:13 ] つまり、例えば時間掛かる処理をするスレッドがあってその進捗をプログレスバーに出すような用途なら、 進捗を書き込むのを処理スレッドに限定してGUIスレッドでそこをvolatileで参照するのもありってことでOK?
197 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 01:57:30 ] マルチスレッドの話は環境によって差異がありすぎるから 環境を限定しない討論に何の意味もないって感じだな。
198 名前:デフォルトの名無しさん [2007/02/27(火) 03:01:55 ] volatile最強伝説が吹き荒れるwww
199 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 08:43:30 ] > 195 > とりあえず、volatileをCの最適化阻害だけと仮定して、 曖昧な仮定だな。 まずはお前の想定している処理系と、そのマニュアルにある volatile参照の仕様を書くんだ。
200 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 09:11:34 ] もう>>182 みたいにvolatileキーワード使って組込型でも何でもロック必須にしちゃいなyo! template <typename T> struct NativeWrapper { operator T&() { return obj; } private: T obj; }; volatile NativeWrapper<int> syncint; mutex mtx; LockingPtr<NativeWrapper<int> > pInt(syncint, mtx); *pInt = 10;
201 名前:195 mailto:sage [2007/02/27(火) 12:18:08 ] >>196 そんなとこ。他ではTwo-Phase Terminationの終了フラグとか。 こちらの場合はメモリーバリアを含んだ同期をループの内部で 実行する事が殆どだから、次のループで確実に気付くだろうけど。 >>197 ,199 おまえら処理系依存って書きたいだけだろ? 実際のとこはどうなのか、って話がしたいんだよ。 少なくともOoOやコヒーレンシが問題になるんだから、 最低限SMP/Multi Core/HT等のアーキテクチャとなる。 例えばIA-32,Power PC,Sparc等のSMPの類をサポートした アーキテクチャのうち、>>195 よりも厳しい制約が必要と なるものは存在するの?
202 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 13:04:58 ] >>201 個々の CPU について考えるなんて面倒だから、 保証されてるかどうかで話したほうが楽なのに。 今は無くても将来にわたって無いとも言えないしね。
203 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 14:04:14 ] >>193 データ構造上の都合か何かでキャッシュラインをまたぐような位置から int を読み込む場合には 3 もだめじゃないかな。
204 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 14:12:43 ] >>201 Intel Itanium では、非共有キャッシュが大きい上にキャッシュフラッシュの順序が 書き込みの順序と異なる。ので、 ・volatile int a を監視 ・aが変更されたら「何か」を行う という処理の場合、大抵は「何か」の準備が出来たから a を1にしてるんだと思うけど、 メモリバリアが無いとその準備の処理結果を読み出せない可能性がある。 例) volatile size_t buflen; volatile char buf[max_buf]; で、 スレッド1: buflen = read(hoge); ... スレッド2: if (buflen>0) { bufを利用; } で、(スレッド2側のCPUから見て)buflen には read の結果のバイト数が書かれているが、 buf の内容はデタラメ、という状況がごく当たり前にあり得る。
205 名前:195 mailto:sage [2007/02/27(火) 14:54:42 ] >>203 キャッシュラインをまたぐ場合って、普通のコードじゃ起きないし、 char buf[sizeof(int)+1]; *(int *)(buf+1) = 0;した場合とかでしょ? 今では例外飛ばさずにアクセスできるアーキテクチャの方が少数派なのでは? >>204 他の変数を確定的に見る必要がある場合はOoOの関係で無理。 >>195 はひとつのintを扱う場合なつもりで書いてます。 >>196 を例にすると、タイマでプログレスバーを更新する時はvolatileのみ、 最後に終了したかを確定的に判断したい時だけpthread_join()するケースとか。
206 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 15:21:57 ] >>205 PCで使われているCPUの98%は、それをごく普通に実行します。 任意位置からの32bitの整数読み出しはMPEG系のビデオコーデックの 処理では多利用されるし。
207 名前:195 mailto:sage [2007/02/27(火) 16:11:02 ] CPUの数が多いのは当たり前だからアーキテクチャって書いたのに。 そんな下らないツッコミは要らないって。。 Codecの処理だろうが、境界整列に反したメモリアクセスなんて 行儀の悪いコードなんじゃないの?少なくともポータブルじゃない。 処理系依存のレベルで言ったらvolatileの比じゃないと思うんだけど。
208 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 16:25:35 ] アーキテクチャの数で言って多いか少ないかについては、 漏れは何も言っていません。 実存するシステムの大半では割合で例外は飛ばないという (関連する)別の事実を提示しただけですよ。
209 名前:195 mailto:sage [2007/02/27(火) 18:33:40 ] >>208 おまえ例外が飛ばないって書きたいだけだろ? 実際のとこはどうなのか、って話がしたいんだよ。
210 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 19:55:55 ] 理屈で勝てそうにないと急におまえ呼ばわりですか。 実際の例で言うなら、MPEGのシステムストリームから4バイト長さの整数を取り出すとき、 ポータビリティを重視している ffmpeg ではバイト単位で取り出して整列してますし、 IA32/64が前提のIPPではポインタをそのままデリファレンスしてアライメントを気にせずに整数を取り出してます。 「普通のコードじゃ起きないし、例外飛ばさずにアクセスできるアーキテクチャの方が少数派」だから、 キャッシュラインまたぎの問題は無視してよいとでも言いたげな感じですが、 実際のとこどんなプログラムをどれだけ調べた上で書いてるんですか?
211 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 20:59:04 ] IA86において、そもそも、アラインメントが狂った位置への アトミック書き込みはできない。
212 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 21:54:58 ] 傍から見てるモノとしては 実装の詳細じゃなくてアーキテクチャの視点で語ってほしいです><
213 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 22:12:28 ] 「相談室」なんだから、なにか適当なターゲットを想定するのが普通だろ メタ論がやりたいならどっか適当にスレ立てろよ これがほんとにマルチスレッド
214 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 23:34:05 ] そういうアクセスははなからそういうあくせすという前提で特別に処理を書くんじゃないの? intでもアトミックに読めないとか、そういう問題とは別次元だろ。
215 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 23:35:07 ] わざとあえて意識してそういうことをしないとそういうことは起こらない。
216 名前:195 mailto:sage [2007/02/28(水) 01:26:31 ] >>210 >>209 は自分じゃないんで・・・。 他の方も書いているように、CodecみたいにCPUベタベタな 最適化を行う場合を考えてもしょうがないかと。 今のところは>>189 や>>196 みたいなケースの場合にvolatileで 不十分な証拠は(処理系依存を除いて)出ていないんじゃないですか? そんなわけで、今のところ>>180 から進展はなさそうに思います。 >>213 自分はPCサーバクラスで使われるCPU辺りをメインに書いてます。 今はノートですらDual Coreだったりするので、その辺りも含めて 昔で言うワークステーションクラスまででしょうか。
217 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 02:53:24 ] 言語組み込みの volatile で全部済ませられると主張するなら、 「あぁそうだといいね」とも思えるが、場合によってはロックが必要なことは 理解しているようだし。そうなると細かいこと考えずに全部ロックしとけば いいと考えそうなもんだ。 なんでそんなに必死になってまでロック使いたくないの? わざわざ保証されてないコード書くメリットが何かあるの?
218 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 06:28:24 ] このスレは頭ごなしにmutex使えやゴラーというやからが多いから意固地になってるのだろう。 結論はそうなんだけど、そこに至る過程を検証したいというのも分からないではない。 mutexの中の人が何をやっているかとか、実際身近にあるPCで賢い小人さんがどう働いているかとか、 そういう話題なら問題は無いだろう?
219 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 13:20:29 ] >>217 >なんでそんなに必死になってまでロック使いたくないの? 実行コストに決まってるだろ。 実行コスト無視できるなら、スピンロック、read-writeロック、プロセス内Mutex、プロセス間Mutex、 の使い分けなんて必要ない。 ただ、volatileで生成されるコードと、他のロックでどちらがコストが高いかは知らん。実行系によるし。
220 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 13:51:46 ] スレッド間で変数を共有する場合問題になるのは次の4つくらいか。 1)変数のレジスターへのキャッシュ。 2)コンパイル時の命令の並び替え。 3)CPUによる命令の並び替え(out of order) 4)CPUキャッシュ間の非同期。 1,2はコンパイラの仕事。 3は単一CPUでは発生しない。マルチCPUでは両方のケースがある。 4は単一CPUでは発生しない。マルチでもコヒーレント(一貫性)が保障されている処理系が多い。 3,4が発生しないでメモリー更新の順番が正しく見える構成をstrong memory orderと呼ぶ。 volatileだと1,2でかつアトミックな操作ができる単独の変数のみ。 メモリバリアは1,2,3,4すべてを満たしていて、 同期系のファンクションを使えばメモリバリアは適切に適用される。 書き込みが1スレッドで多数の読み込みスレッドがある場合に通常のLockが負荷が高いようなら、 ReadWriteLockとかInterLockとかそういったものを検討すべきだろう。
221 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 13:57:54 ] >>195 >いつまで経っても同期されないような腐ったCPUってあるの? >あったとしたら処理系としてBrokenだよなぁ・・・。 ないとは言い切れない。互換性、安全性をとるなら同期ファンクションを使っておこう。 windowsXPまではstrong memory orderを前提にしているらしい。 MSDNのvolatileの説明が変なのはこのためだろうか。 移植性を無視してターゲットを絞るなら独自にいろいろやるのもありかもしれないが、 windows2003(今のところItanium用だけらしいけど)からは上記の3,4があるweak memory orderも 視野にいれているらしいから、こういうヴァージョンアップ時に困るな。
222 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 17:09:18 ] 組み込み用だとキャッシュの同期なんて全くしない環境もあるようだが、 (そもそもCPUがマルチプロセッサ用に作られていない) そういう環境にマルチスレッド対応のOSが移植されてるかは、 ググってみたが見つからなかったな。 一昨年あたりから、組み込み用CPUでもキャッシュ同期メカニズムを 持った物が出てきたようで、SMP対応のlinuxが移植されてたりするけど。
223 名前:195 mailto:sage [2007/02/28(水) 17:27:11 ] >>218 ほぼそんなとこです。 あとは、なんでPOSIX ThreadsにCASがないのか、とかね。 プリミティブ志向な設計なんだから追加されてもいいのに。 有名どころのアプリのいくつかは自前で実装してたりするし。 >>221 そりゃないとは言い切れないでしょ。 でもそういうのって、二の補数表現や1byte=8bitを仮定して プログラムを書くのは良くないってのと同じなんじゃないの? 1word=36bitみたいな変態アーキテクチャを相手するのと一緒。
224 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 00:19:15 ] _beginthreadの使い方について質問です。 子スレッドの処理が止まっているとき、終了する方法が知りたいです。 ----------------------------------------------------------------- //子スレッドの関数 void thread_func(){ //Sleep();やソケットのaccept関数など永久に待つ関数などで、 //処理が止まっているので終了状態になりません } //子スレッド呼び出し thread_id = _beginthread(thread_func,0,(void *)param) //終了処理 GetExitCodeThread( thread_id,lpExitCode );//終了コード取得 ExitThread(lpExitCode );//終了コード指定して終了 CloseHandle(thread_id);//ハンドル閉じる ----------------------------------------------------------------- 1、子スレッドのsleep、accept関数など待ち状態を、解除する方法あるでしょうか? 処理が進めば、_endthreadで終了することが出来きるのですが。 2、強制的に親スレッドから、安全に子スレッドを強制終了する方法あるでしょうか? _beginthreadは、CreateThreadを呼んでるみたいなのですが、上記のように "//終了処理"しても大丈夫でしょうか?安全な方法教えていただけないでしょうか。 よろしくお願いします。
225 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 00:19:22 ] >>223 なんで良くないと言われていることをわざわざやりたがるの?
226 名前:sage mailto:195 [2007/03/01(木) 00:43:41 ] >>225 良くないって、仕様で未定義だからってだけでしょ? 検証もせずに「お母さんが駄目って言ってたから」な方が嫌。
227 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 01:06:04 ] >>226 最近のレスでロック API の仕様の根拠となるものはあらかた提示されたんじゃないの?
228 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 01:22:09 ] >>224 とりあえず、 ・必要なら、子スレッドでは極力タイムアウトするAPIを使う ・_beginthread()の場合、スレッド関数の戻りで子スレッドのハンドルは自動開放されるので 明示的に開放する必要はない ・少なくとも_beginthread()のハンドルにCloseHandle()を使うのは間違い きちんと対応する関数をセットで使わなければいけない ・ただ、親スレッドでExitThread()したら、その後のCloseHandle()は実行されないよ ・子スレッドの安全な中断方法はない。 突っ込み所満載すぎるので、MSDNなりナニなりよく読むべし。
229 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 03:23:13 ] >>228 タイムアウト処理を考えるという方針でいきたいと思います。 sleepは時間を短くすればいいですし、 acceptは、selectを使ってrecvのタイムアウト関数(timeoutRevcとします) と同じにすれば、timeoutAccept関数作れるかもしれないです。 ・timeoutAccept抜けたら、はじめの一回目は、ソケットが読み込めるのわかってるので普通のrecv関数を呼ぶ。 ・次の受信から、timeoutRevc呼ぶ感じでしょうか。 いくつも箇条書きでアドバイス、ありがとうございました。
230 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 07:04:23 ] 229です。 acceptする前に、select関数使えないんでしょうか。 FD_ZERO(&readfds); FD_SET(soc,&readfds); select(width,&readfds,NULL,NULL,&timeout) socは、きちんと渡せていたんですが、接続試しても select抜けられずに、全部タイムアウトになります。 accept呼んでからじゃないと、ソケットの読み取り可能か わからないかもです。 スレ違いになりますので、ネットワークのスレに行きたいと思います。 ありがとうございました。
231 名前:デフォルトの名無しさん [2007/03/01(木) 11:14:25 ] やべーvolatile最強すぎる 「volatileが最強でない環境って存在するの?」 「現存しないからvolatile最強wwwwwwwwwwwwwwwwwwww」 >>161 でFA出てるしwww
232 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 11:18:50 ] 2000年問題に通じるものがあるな
233 名前:デフォルトの名無しさん [2007/03/01(木) 12:28:10 ] [すれ立てるまでもない質問はここで] で聞いてたんだが、此処で聞いた方が良いかと思ったので、 再質問させてもらいます。 Windows MFCでマルチスレッドは止めておいた方が良い と、良く聞くんだけど、具体的にどんな問題が発生するのか 掲示しているところが無いんだけど、どうしてMFCでの スレッドは嫌われるのか教えてもらえないでしょうか。 単なる好奇心なので、仮説でもうれし。
234 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 12:42:43 ] 誰が言ってんだ、そんなこと。
235 名前:デフォルトの名無しさん [2007/03/01(木) 12:48:10 ] >>233 それま色々なスレで同じ質問をしないほうが良いと言われただけでは?
236 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 12:50:14 ] >>233 とりあえず移動元に誘導書いておけよ、マルチ扱いされるぞよ。 俺も聞いたことない。