68user's page 掲示板

Prev< No. 1976〜1977> Next  [最新発言に戻る] [過去ログ一覧]
No. 1976 # isaq [E-mail] 2001/05/21 (月) 20:44:46
はじめて質問させていただきます。
本ページで色々勉強させて頂いてます(感謝)

当方のレベル)初心者
winsockを用いたマルチスレッドクラサバ作成調査中
クライアント・サーバ間の通信確立方法の基本は理解(してるつもり)

内容)
クライアントからの接続要求が複数同時に(理論的に全く同時はありえないかもしれませんが)サーバにきた場合、サーバ側のリクエスト待ちプロセス内のlisten関数は、どのようにこの要求を処理するのでしょうか?つまり、全く同時のアクセスに対して、listen関数が作る待ち行列(キュー)にはどう格納されるのでしょうか?
要求受付後は、各クライアント毎に処理を並行に行う(マルチスレッド)
ことができますが、要求受付部のlisten関数はマルチ対応なのかどうか
、前出の全く同時の接続要求はどう処理されるのかが分からないので、ご存知の方が、是非ご教授いただければありがたいです。
質問内容が初歩的かもしれませんが、よろしくお願いしますm(__)m

No. 1977 # 68user 2001/05/22 (火) 15:14:41
>>1975 ENO
マルチポストは禁止です。
    http://X68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?howtouse

>>1976 isaq
要は、listen が thread safe かどうか、ということでしょうか?

複数のスレッドが同時にクライアントとの接続を取り合ったりしないのか? と
いう意味かと思いますが、listen は OS へ「クライアントからの接続を受け
付けなさいと」命令するだけです。それに対して、accept は OS がキュー
イングしておいた待ち行列から、先頭のクライアントを取り出す命令。

というわけで、listen や accpet のマニュアルを見て、thread safe か
どうかを確かめましょう。

FreeBSD ならばマニュアルに
      http://www.jp.FreeBSD.org/cgi/mroff.cgi?subdir=man&man=listen&dir=jpman-4.3.0%2Fman

      非スレッドライブラリ listen() は listen システムコールとして実装されています。

      スレッドライブラリでは、 listen システムコールは _thread_sys_listen() に
      アセンブルされ、 listen() は読み書きについて s をロックしてから、
      _thread_sys_listen() を呼び出す関数として実装されています。戻る前に
      listen() は s をアンロックします。
とあります。Windows は知りませんが、マニュアルに書いてあるのでは
ないでしょうか。

あるいは、「スレッド」という用語を、pthread などの thread でなく、
単に「並行動作」という意味で使ってますか?

Prev< No. 1976〜1977> Next  [最新発言に戻る] [過去ログ一覧]