- 1 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 11:23:05 ]
- マルチスレッドプログラミングについて語るスレ。
OS・言語・環境は問わないが、それゆえ明記すべし。 その1 pc3.2ch.net/test/read.cgi/tech/997345868/ その2 pc5.2ch.net/test/read.cgi/tech/1037636153/ その3 pc8.2ch.net/test/read.cgi/tech/1098268137/
- 520 名前:519 mailto:sage [2006/06/12(月) 19:39:57 ]
- 今思いついたんだけど、とにかくタイムアウトさせたいなら
GetCurrentThread() で得たハンドルを wait してもいいのかもしれない。
- 521 名前:デフォルトの名無しさん mailto:sage [2006/06/12(月) 19:45:59 ]
- >>519
アドバイスありがとうございます。 ただ、デバッガで追ってみましたところきちんと毎回Waitしている様子です。 Wait時間を分かりやすく5秒にしてみたところ、私の期待通りの動作をしているようです。 selectについてもこれから試してみたいと思います。
- 522 名前:デフォルトの名無しさん mailto:sage [2006/06/12(月) 19:53:00 ]
- Sleep、WaitForSingleObject、いずれも、寝ている時間の精度自体は5msも保証できない
- 523 名前:デフォルトの名無しさん mailto:sage [2006/06/12(月) 19:57:04 ]
- >>522
なんと、そうなのですか? やはりFPS60なんていう精度を望む場合 Waitなんて無しでぶんまわしつづけるしかないのでしょうか? (そもそも、Windowsで精密ゲームを作ること自体、Windowsの設計理念とは反している気がしますが)
- 524 名前:519 mailto:sage [2006/06/12(月) 20:25:43 ]
- >>521
そですか・・・ところでメインスレッド側は PeekMessage 無しに戻しましたか? 単純に >>518 から else 以降を取ってしまうと、CPU 100% のビジーループに なるわけですが。
- 525 名前:デフォルトの名無しさん mailto:sage [2006/06/12(月) 21:08:55 ]
- ところで、なんで、NOREMOVEでPEEKしたあと、またGetMessage呼んでるの?
単純に、直接REMOVEでPEEKして、Translate,Dispatchすればいいと思うんだけど
- 526 名前:デフォルトの名無しさん [2006/06/13(火) 14:46:50 ]
- pthread_create() で作ったスレッドが終了したかどうかの確認は
どうしたらいいんでしょうか? pthread_join() してしまうとその スレッドが終わるまで待たされてしまいますよね? やりたいことは、複数のスレッドを作って、作った側で pthread_t の配列にスレッド識別子を入れておき、それぞれがバラバラの 時間で終わるんですが、作った側で pthread_t の配列に入っている 値を元にそれぞれが終わったかどうかを確認して、終わっていたら それに対して pthread_join() をやって資源開放をて、配列の側も その部分を終了しているという値(たとえば0)にしたいんです。 (つまり UNIX で複数 fork() したあとで waitpid() の WNOHANG みたいにして何が終わったか、あるいは何も終わっていないのかを 確認するのと同じことです)。こういうのは pthread ではどうやる んでしょうか?
- 527 名前:デフォルトの名無しさん mailto:sage [2006/06/13(火) 21:33:23 ]
- pthreadは詳しくないけど自分でフラグ作っても大して開発効率落ちないと思う。
- 528 名前:デフォルトの名無しさん mailto:sage [2006/06/14(水) 00:10:40 ]
- SIG_CHLDシグナルで判断しろよ
- 529 名前:デフォルトの名無しさん mailto:sage [2006/06/14(水) 12:15:21 ]
- >>528
pthread で作ったスレッドに対して SIGCHLD は使えないのでは? 子プロセスじゃないんだし。(Linux の実装だと使えるとか?)
- 530 名前:デフォルトの名無しさん mailto:sage [2006/06/14(水) 13:11:53 ]
- POSIX P1003.1cにpthread_kill()ってのがあって、
signalを指定する引数に0を指定すると、 pthreadがいれば成功(シグナルは何も送られない)、 いなければESRCHのエラーになる。 processに対するkill(2)と同じ仕様。 > 自分でフラグ作っても大して開発効率落ちないと思う。 ではありますが。
- 531 名前:デフォルトの名無しさん mailto:sage [2006/06/14(水) 13:23:26 ]
- >>530
あー! その手があったか。 くっそー。 pthread_kill() の man ページは見ていたのに気が付かなかった。 どうもありがとうございます。
- 532 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 17:46:23 ]
- スレッドのデバッグって何使ってますか?
Linuxだとgdbだけかな?
- 533 名前:デフォルトの名無しさん mailto:sage [2006/06/19(月) 00:32:10 ]
- 知恵と勇気
- 534 名前:デフォルトの名無しさん mailto:sage [2006/06/19(月) 01:05:12 ]
- >>533
そんなのいらねーよ何か教えねーと食うぞ?
- 535 名前:デフォルトの名無しさん mailto:sage [2006/06/19(月) 10:33:24 ]
- 「ちびくろ! おまえを たべちゃうぞ!」と、とらは いいました。
- 536 名前:デフォルトの名無しさん mailto:sage [2006/06/19(月) 21:49:53 ]
- >>532
かん
- 537 名前:デフォルトの名無しさん mailto:sage [2006/06/20(火) 13:18:17 ]
- >>532
おれ、この前 gdb でやってみて大混乱。 使い方調べてから使わないといかんね。
- 538 名前:デフォルトの名無しさん mailto:sage [2006/06/24(土) 17:19:02 ]
- 無茶しやがって…
- 539 名前:デフォルトの名無しさん mailto:sage [2006/06/24(土) 21:26:39 ]
- Windowsで、タスク内の複数スレッド間だけで通用する、高速な同期オブジェクトって無いですかね?
なんか、どれもこれも、重そうで。
- 540 名前:デフォルトの名無しさん mailto:sage [2006/06/24(土) 23:41:41 ]
- イベント系はユーザーモードで実行される。
イベント系はプロセス間の動機にも使えるという強みがある。 クリティカルセクションのみカーネルモードで実行される。 クリティカルセクションはプロセス間の動機で使えないがイベント系に比べると 非常に高速だという強みがある
- 541 名前:デフォルトの名無しさん mailto:sage [2006/06/24(土) 23:49:15 ]
- >>540
クリティカルセクションって何?
- 542 名前:デフォルトの名無しさん mailto:sage [2006/06/24(土) 23:58:44 ]
- ミューテックスとほぼ同じ。
タイムアウト指定ができなかったりする。
- 543 名前:デフォルトの名無しさん mailto:sage [2006/06/25(日) 00:07:28 ]
- カーネルモードに移行するものが高速で
ユーザーモードのまま実行できるものの方が遅いって?
- 544 名前:539 mailto:sage [2006/06/25(日) 03:10:41 ]
- クリティカルセクションだと、スレッド間での排他は楽だけど、同期には使えないよね。
イベント系はカーネルまで落ちるし、プロセス間で使えるから重いよね。 同期に使えて、カーネルまで落ちなくても良いようなヤツが欲しいンだけど、 Windowsでは用意されてない気がするんだ。 それって、正しいのかな?
- 545 名前:デフォルトの名無しさん mailto:sage [2006/06/25(日) 03:29:24 ]
- 2つのスレッドだけでいいのならクリティカルセクションでも同期は取れる。
最初にどちらかのスレッドが所有権を保持するようにする。 片方のスレッドはEnter.....()で所有権が解放されるまで待機。 所有権を持っていたスレッドが所有権を解放すれば片方のスレッドは 実行が開始されるようになる。 高速性が大事でかつ簡易な同期処理でいいならこんな方法もある。 関数自作するとか。排他制御ができれば後は自分でいろいろできる。
- 546 名前:デフォルトの名無しさん mailto:sage [2006/06/25(日) 06:33:19 ]
- Fiberでも使ってみたら?
NT以降専用だが。
- 547 名前:デフォルトの名無しさん mailto:sage [2006/06/25(日) 07:21:53 ]
- 以前も微妙に話題になったが、MeteredSectionとか、
AdvancedWindowsのOptExとかで楽しちゃうってのもある。 MeteredSection ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndllpro/html/msdn_metrsect.asp OptEx tp://www.microsoft.com/msj/archive/S1DA0.aspx
- 548 名前:539 mailto:sage [2006/06/26(月) 17:26:10 ]
- >>545
>>546 >>547 とりあえず、情報どうも。Fiberだと排他・同期というより切替に近いので、同期にはならない気がする。 問題は、CriticalSection系は、同一スレッド上では同期しないので、>>545さんの方法、OptExはちょっと難しい感じ。 つーか、それだとどちらか片方の処理が重いときにバグになっちまう。 ということで、MeterdSectionを使うのが良いのかなぁ。でも、こいつ、CriticalSectionの拡張版みたいなもんみたいだから、 排他は出来るけど、同期は難しそう。 探したら日本語のページがあったので貼り付け。 ttp://www.microsoft.com/JAPAN/developer/library/jptech/msdnnews/metrsect.htm それとも、原始的にロックファイル作るか…うーん、100近いスレッドが立ったとき考えるとやりたくないな…。 とりあえず、Mutexあたりを、最初にまとめて作成することで負担を減らすしかなさそうな感じ。 みなさん、ありがとう。 では。
- 549 名前:デフォルトの名無しさん mailto:sage [2006/06/27(火) 21:28:46 ]
- >>548
具体的にどんな処理がしたいの? 単一プロセス内ならCriticalSection で何でも作れるよ (だからこそOSもCriticalSectionしか提供してないわけで)。 あと「同一スレッド上では同期しないので」ってのはどういうことを 意図してるのかちょっとわからない・・・同一スレッドで非同期に コードが実行されるのは Unix の signal のケースくらいで、 Windows のユーザモードでは起きないんじゃない?
- 550 名前:デフォルトの名無しさん mailto:539 [2006/06/27(火) 22:11:04 ]
- >>549
ありゃ、そういう答えが返ってくると言うことは、 もしかして オレのCriticalSectionについて根本的な使い方や理解が間違ってるのかな…。 スレッドひとつしか無ければ、EnterCritical...をいくつ並べても無視されると思ってたんだけど、違うのかな…。
- 551 名前:デフォルトの名無しさん mailto:sage [2006/06/27(火) 22:13:57 ]
- スレッドひとつならマルチスレッドじゃないからな
- 552 名前:デフォルトの名無しさん mailto:sage [2006/06/27(火) 22:21:17 ]
- そんなにパフォーマンス気にしてるのに
何でロックファイルとかにいくんだ…
- 553 名前:デフォルトの名無しさん mailto:sage [2006/06/27(火) 22:39:45 ]
- 英語でプログラミング勉強スレ
academy4.2ch.net/test/read.cgi/english/1151414777/l50
- 554 名前:539 mailto:sage [2006/06/27(火) 22:53:13 ]
- >>551
でも、プログラムは大抵、ひとつのスレッドから開始されるんだよ。最初からふたつってわけじゃない。 まあ、だから、>>545 は使えないんだよな。
- 555 名前:デフォルトの名無しさん mailto:sage [2006/06/27(火) 23:12:31 ]
- なにか、壮大な勘違いをしている予感
- 556 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 01:48:11 ]
- まず、「同期する」をどういう意味で使っているのか説明してもらってからだな
- 557 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 01:56:37 ]
- 同期の人と一緒に仕事をする
同期するじゃね?
- 558 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 03:31:41 ]
- >>539
そういうのは、ふつーにeventだの何だのをでも使ってみて、重くてやってらんなくなってから考えれば良い。
- 559 名前:539 mailto:sage [2006/06/28(水) 14:26:16 ]
- >>558
なんだそりゃ。そう言う回答は勘弁して欲しいぞ。
- 560 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 16:09:22 ]
- なんで>>539は質問してる身分でやたらと偉そうなの?
リアルでもそういう質問の仕方しか出来ない人?
- 561 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 16:16:15 ]
- >>559
「回答」ではないだろう。 「重そう」と思うだけで実際にやってみることもせず そのくせ「ロックファイル」なんて単語まで飛び出し 結局何がしたいのか、「同期」が何を指しているのかも 説明してくれない君への アドバイスじゃまいか。
- 562 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 16:45:09 ]
- おまえら馬鹿なんじゃね?
- 563 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 16:54:40 ]
- >>560-561
ウザ
- 564 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 17:45:49 ]
- つーか、時々デッドロックするようなプログラムしか作ってないのかょ、おまえらは。
- 565 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 17:46:52 ]
- なにか、壮大な勘違いをしている予感
- 566 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 18:17:22 ]
- なにかが気に喰わなくて暴れ始めたお母ん
- 567 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 18:54:40 ]
- 予感でプログラムが組めるヤツはニュータイプ。
- 568 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 21:21:38 ]
- まてまて。
>>539 はWindows のカーネルやAPIを設計した人たちや 普段からマルチスレッドAPなんかさんざ書いてる漏れも 見落としている、何か難しい問題に対処しようとしてるんだよ。 それはたぶんロックファイルと関係のあるなにかなんだろう。 漏れには想像もできないが、頭ごなしに否定しないでだまって 観察してあげるべきじゃないか?
- 569 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 22:34:06 ]
- なにか、壮大な勘違いをしている予感
- 570 名前:asdlman mailto:sage [2006/06/28(水) 22:40:26 ]
- >>569
>>555 lead reth !!!
- 571 名前:asdlman mailto:sage [2006/06/28(水) 22:47:52 ]
- >>569
>>555 test
- 572 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 23:21:13 ]
- Vistaから同期IOのAPIがキャンセル可能になるそうですね!
- 573 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 13:12:51 ]
- それは、非同期IOのことだろ。
- 574 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 15:47:52 ]
- >>573
同期IOだよ。非同期IOのキャンセルならWindows98でも出来る。
- 575 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 15:54:38 ]
- それを非同期というのではないのか?
- 576 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 16:11:59 ]
- >>575
めんどくさいなーもう。ほらよ↓ 今まではCerateFile なんか非同期版がなかったからキャンセルできなかっただろ? www.microsoft.com/japan/msdn/windowsvista/general/win32iocancellationapisv2.aspx
- 577 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 16:29:46 ]
- >>575
いや、絡んでるつもりは全くなかったんだ、すまん。 つまり、同期I/Oを他のスレッドで実行することによって擬似非同期I/Oの ような使い方をしたときに、そのAPIの実行をキャンセルすることができる ようになったということだな。 同期/非同期とはそういうことだったのか。勉強になった。
- 578 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 16:30:17 ]
- s/>>575/>>576/
- 579 名前:デフォルトの名無しさん [2006/07/01(土) 17:16:56 ]
- Linuxのカーネル層でマルチスレッドのような
設計が必要になっているんですが、 Aという関数が終わったらBの関数で 止めていたところが動き出すような設計って どうやったら良いもんですか? セマフォを使った排他処理ってデータに 対する排他処理になると思うんだけど、 そういう形で発想の転換をしないと駄目なのかな?
- 580 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 19:10:53 ]
- 待ちたいところでスピンロックでもasm WAITでもなんでもしておけばいいだろう
- 581 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 21:33:47 ]
- >>579
condは適当に初期化。 A() { 〜; pthread_cond_signal(&cond); return; } B () { pthread_cond_wait(&cond); 〜; return; }
- 582 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 22:07:31 ]
- >>581
参考になります。 これってAのreturnの直前でBが動き出す ということですよね? Aが終わってからってのはやっぱり難しいのかな。
- 583 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 22:20:08 ]
- >>582
AA() { A(); pthread_cond_signal(&cond); return; }
- 584 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 22:23:13 ]
- >>522
昔の奴へのレスで恐縮なんだがWindowsのSleepってそんな精度悪かったっけ? ::timeBeginPeriodとか使っても駄目?
- 585 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 22:49:29 ]
- 他に忙しく仕事をする連中が居なければ、だいたいは大丈夫かもね。
- 586 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 23:26:40 ]
- >>585
なるほど まあそれほど信用できないってことか。
- 587 名前:デフォルトの名無しさん mailto:sage [2006/07/02(日) 00:04:19 ]
- スレッドの教科書ってどんなのあるの?
アルゴリズム系に強いやつが欲しい
- 588 名前:デフォルトの名無しさん mailto:sage [2006/07/02(日) 00:14:48 ]
- OSによって違うな。
pthreadなら>>1->>9辺り見て。
- 589 名前:デフォルトの名無しさん mailto:sage [2006/07/02(日) 00:18:29 ]
- Lamport's bakery algorithmとかさこんな古典的なやつから
今の新しいアルゴリズムまで載ってるのないのか.....
- 590 名前:デフォルトの名無しさん mailto:sage [2006/07/02(日) 00:49:51 ]
- >>583
AAは別の人のソースなので手を加えられないのです。 でも参考になりますた。 ありがとうございますた。
- 591 名前:デフォルトの名無しさん mailto:sage [2006/07/03(月) 06:53:31 ]
- windows には win32 API で色々なイベントを使えるようになってますが、
UNIXではpthreadのイベントを使う以外にないのでしょうか?
- 592 名前:デフォルトの名無しさん mailto:sage [2006/07/03(月) 07:26:25 ]
- >>591
例えばこういう奴? www.monkey.org/~provos/libevent/ どの UNIX を対象にしているかで答えも変わるけど、大抵はググれば色々出て来る。
- 593 名前:デフォルトの名無しさん [2006/07/05(水) 10:16:26 ]
- Winsock、_beginthreadで起動して、
グローバル変数で終了要求するような、 簡単なスレッド書いているのですが、、、。 スレッド内でrecv()のような、 ブロックするような関数を呼びたくなりました。 これを終了するにはどうしたらよいでしょう。
- 594 名前:デフォルトの名無しさん mailto:sage [2006/07/05(水) 10:30:57 ]
- ソケットオプションでノンブロッキングにすればいいんでない?
- 595 名前:デフォルトの名無しさん [2006/07/05(水) 11:33:24 ]
- 594>
ありがとう、そうします。 一般的にはどうでしょ? ブロッキングするような関数をスレッドで呼んではいけない?
- 596 名前:デフォルトの名無しさん mailto:sage [2006/07/05(水) 11:51:06 ]
- ブロッキングするべき状況と、そうでない状況がある。
前者ならブロックさせとけばいいし、そうでなければ非同期APIを使うか、 別個にスレッドを作ればいい。
- 597 名前:デフォルトの名無しさん mailto:sage [2006/07/05(水) 11:59:52 ]
- >>593
recv()呼ぶ前にMSG_PEEKしておくなりしとかんとあかんよ。 #つーか、TCP受信処理を途中で終わらせると言う仕様そのものが如何なものかと。
- 598 名前:デフォルトの名無しさん mailto:sage [2006/07/05(水) 13:48:39 ]
- >>595
一般的かどうかは知らないけど、普通はselect使うんじゃないかな。
- 599 名前:593 [2006/07/05(水) 13:49:40 ]
- >>596
「強制終了」以外は普通にブロックして、データが届いたときだけ 処理してくれればいいんだけど。って状況でした。 非同期っていうと、WSAEventSelect, WSAAsyncSelectで、通知を待つって ことでよいですよね? >>597 ちょっとわかんないのですが、 MSG_PEEKで、受信データが無いときはどうやって次の受信データを待つのが綺麗? あと、途中で終わらないとしたら、どうやって終わるのがよいですか?
- 600 名前:デフォルトの名無しさん mailto:sage [2006/07/05(水) 18:14:11 ]
- >>599
WSAAsyncSelect(s, hwnd, 0, 0); shutdown(s, 1); while (recv(s, buf, buflen, 0) != 0) {} closesocket(s);
- 601 名前:デフォルトの名無しさん mailto:sage [2006/07/05(水) 19:33:20 ]
- >>600
それ先方がデータ送ってくれないとCPU100%のビジーループ。 サーバアプリでは非常によろしくないコーディング。
- 602 名前:デフォルトの名無しさん mailto:sage [2006/07/05(水) 19:50:55 ]
- recvって、ブロックするんじゃないの?
- 603 名前:デフォルトの名無しさん mailto:sage [2006/07/05(水) 19:54:13 ]
- スマソ。ノンブロッキングのソケットと勘違いしてた。
- 604 名前:デフォルトの名無しさん mailto:sage [2006/07/05(水) 20:35:06 ]
- WSAAsyncSelectした時点でノンブロックになる
- 605 名前:593 [2006/07/06(木) 17:50:25 ]
- 任意のタイミングで終了させたいスレッド内では、ブロックする関数は呼ぶな。
socketはデフォルト非同期で。 で理解しました。 ありがとう。
- 606 名前:デフォルトの名無しさん mailto:sage [2006/07/06(木) 19:44:58 ]
- >>605
そう理解したんならそれでもいいが・・・
- 607 名前:デフォルトの名無しさん mailto:sage [2006/07/06(木) 22:55:34 ]
- ソケットを任意のタイミングで終了させると再起動したときにわややがな。
- 608 名前:593 [2006/07/06(木) 23:34:44 ]
- >>607
どゆこと? 例えばサーバ的なアプリで、その受信用スレッドを、サーバ的なアプリ のユーザ都合でブチっとしたくなった場合、、、 受信処理を終了させて、クローズなり何なりをしたい。 そんな場合ですが、再起動とは、ここでサーバ的なアプリを再度起動して 受信を始めようとした場合になにかが起こるってことですか?
- 609 名前:デフォルトの名無しさん mailto:sage [2006/07/07(金) 00:34:15 ]
- 下の層が受信しているのにアプリが落ちたら、次に起動するときにbindErrorになる。
- 610 名前:デフォルトの名無しさん mailto:sage [2006/07/07(金) 00:43:27 ]
- つかさ、断片的な情報を積み重ねて信頼性のないアプリ作るよりさ、
ばしっとWinsock Programmer's FAQとか、Winsock関連書籍を読み とおして、きちっとしたアプリを作ろうとは思わんのかね。
- 611 名前:デフォルトの名無しさん mailto:sage [2006/07/07(金) 01:07:01 ]
- >>609
アドバイスするなら、その前にFAQくらい読んどけよ。 知識足りなさ過ぎ。
- 612 名前:593 [2006/07/07(金) 10:11:03 ]
- >>610
終了するときは、shutdown(sock, 1) をスレッドの外から呼べ、 そうするとrecvが0返すので、スレッドを抜けろ。 で、理解しました。ありがとう。
- 613 名前:デフォルトの名無しさん mailto:sage [2006/07/07(金) 11:42:52 ]
- >>609
100%賛成して同意して応援します。 他人のいう事に惑わされたりマニュアルやFAQを読んだりせず、 先方が送信を続けている間は終了できないプログラムを作り続けてください。
- 614 名前:デフォルトの名無しさん mailto:sage [2006/07/07(金) 11:56:22 ]
- >>593
fcntl(s, F_SETFL, O_NONBLOCK); って使えない? (Windowsだとこれはないのかな?) >>595 select() 使う場合は他のスレッドが同じソケットから読まないように 作る必要がある。recv() ではあまりないかも知れないが、サーバ用に bind() した一つのソケットに対して複数のスレッドから accept() する場合にselect()使うとハマる(2つ以上のスレッドがselect()を通過 した場合に一つのスレッド以外がブロックする)。防止するには上に 書いたような fcntl() で O_NONBLOCK セットして accept() で止まら ないようにする。 >>609 最初に setsockopt() で SO_REUSEADDR をセットしとけばいいんじゃないか?
- 615 名前:デフォルトの名無しさん [2006/07/08(土) 02:08:08 ]
- volatile最強
- 616 名前:デフォルトの名無しさん mailto:sage [2006/07/08(土) 10:36:46 ]
- メモリモデル勉強しる
- 617 名前:593 [2006/07/09(日) 20:09:28 ]
- 最後にもひとつ。
一般的に、マルチスレッドで使われることを前提にした、受信待ちのような ブロックする関数を提供しようとした場合は、それと一緒に受信を中断 して安全に返るための、他のスレッドから呼ばれる関数(socketの場合のshutdown) を提供すればよい。 ですか? 他に綺麗な方法あったら教えてください。
- 618 名前:デフォルトの名無しさん mailto:sage [2006/07/09(日) 20:26:23 ]
- 一般的には、recvでブロックさせるのではなく
select系でブロックさせて selectをブレークさせる方法を使うだろ。 つまり「外部から解除できないブロッキング関数ではブロックさせない」と。
- 619 名前:デフォルトの名無しさん mailto:sage [2006/07/09(日) 20:28:20 ]
- selectってキャンセル可能だっけ
- 620 名前:デフォルトの名無しさん mailto:sage [2006/07/09(日) 20:36:02 ]
- selectで同時にパイプを待ったり
WSAEventSelectで同時にEventを待ったり というやり方のこと。
|

|