コrecv()と同じブロックソケットからスレッド
質問
こませていただきました。ソケット s
, あなたは、現時点で入手可能な情報かかるとはブロックソケットと呼びま recv
かつスレッドでは一回しか出来ないのですか?まつのスレッドのデータはもらえますか?ももっと簡単に作って欲しい。の第2回呼 recv
戻りエラー?
解決
1つのスレッドがそれを取得する、と指示する方法はありません。
これは、合理的なデザインのように見えるしていません。あなたが同じソケットにrecv()
呼び出す二つのスレッドを必要とする理由はありますか?
他のヒント
ソケットの実装は、スレッドセーフである必要があり、それが利用可能になったときに、正確に1つのスレッドのデータを取得する必要があります。他のコールは単にブロックする必要があります。
まいにお薦めするのだが、ここでの私の理解
ベンダーの保証 スレッドの安全性 味だける複数のスレッドで安全に使用 独自の ソケットを保証するものではありません atomicity 全体を単一の呼びでない約束は、特定の配分のソケットのデータを複数のスレッド)。
かのスレッドを呼recv()ソケットとTCP受信データストリーミング配信が高ます。まrecv()する必要は原子、そのスレッドがブロックその他全てのスレッドから実行が必要で連続運転をすべてのデータまでそのバッファが溢れています。) ることにならない。そのため、前の書面による許諾無く、これらがrecv()は免疫コンテキストスイッチング時の値です。※
逆に、仮にスレッドは、こ ブロック 呼び出recv()、TCPソケットのデータは遅くなります。そのために呼び出recv()を返しますとerrno設定EAGAIN.
いずれの場合には、かのスレッドB通話recv()と同じソケットがスレッドはまだ受信データです。ただし一部のサービスについてはスレッドの停止を得データを渡すようにスレッドBで受信データはもらえますか?わからないのUnix実施するように覚えているスレッドでの操作のソケット;その代わりに、アプリケーション側(スレッドA-B)との交渉を使用していただいて結構です。
一般に、デザインのアプリだけのスレッドを呼recv()はシングルソケットが開かれます。
のrecvのマニュアルページから
のrecv()SOCK_STREAMソケットに できるだけ多くの利用可能な情報を返します。 バッファのサイズは、缶に供給されます ホールドます。
それは質問で指定されていないため、あなたはTCPを使用していると仮定します。ですから、スレッドAとスレッドBの両方のソケットのためのrecv()でブロックを持っていると仮定します。 sが、それがいずれかのスレッドのブロックを解除します受信するいくつかのデータを持っていたら、Aを言い、そしてデータを返すことができます。返されたデータは、限り我々が懸念しているとして、いくつかのランダムなサイズのものであろう。スレッドAは、受信したデータを検査し、それはメッセージがアプリケーションレベルの概念であり、完全な「メッセージ」を、持っている場合を決定します。
スレッドAは、それが完全なメッセージを持っていないことを決定、それは()を再度RECVを呼び出します。しかし、その間にBがすでに同じソケット上でブロックし、そして緩くここで意図した私が使用していたスレッドAのために意図された「メッセージ」の残りを受けています。
さて、スレッドAとスレッドBの両方が不完全なメッセージを持っている、と、コードが書かれている方法に応じて、無効として離れてデータを投げる、または奇妙な、微妙なエラーが発生します。
私は経験からこのことを知らなかったと言うことができたいと思います。
RECV()自体は技術的にはスレッドセーフである一方、だから、あなたがTCPのためにそれを使用している場合、同時にそれを呼び出す二つのスレッドを持つことが悪い考えです。
私はあなたがUDPを使用しているとき、それは完全に安全である知っている限ります。
私はこのことができます願っています。