26

複数のスレッドが単一のソケットまたはパイプハンドルで同時に実行poll()または呼び出しを行う状況について、POSIX およびその他の標準は何と言っていますか?select()

データが到着した場合、待機中のスレッドの 1 つだけが起動されるのか、それとも待機中のすべてのスレッドが起動されるのか?

4

4 に答える 4

23

興味深い質問です... 現在のPOSIXを読みましたが、特定の答えが見つかりませんでした。つまり、同時呼び出しに関する仕様がありません。では、標準がすべて目を覚ますことを意味すると私が考える理由を説明します。

/のテキストの関連部分は次のとおりです。selectpselect

正常に完了すると、pselect() または select() 関数は、readfds、writefds、および errorfds 引数によって指されるオブジェクトを変更して、どのファイル記述子が読み取りの準備ができているか、書き込みの準備ができているか、または保留中のエラー状態を持っているかをそれぞれ示します。 、[...]

以降

O_NONBLOCK がクリアされた入力関数の呼び出しがブロックされない場合、関数がデータを正常に転送するかどうかにかかわらず、記述子は読み取りの準備ができていると見なされます。(関数は、データ、ファイルの終わりの表示、またはブロックされていることを示すもの以外のエラーを返す可能性があり、これらの各ケースで、記述子は読み取りの準備ができていると見なされます。)

要するに (読み取りの場合のみ)、これは次のように理解できます。

selectこれは、 を使用した入力関数への次の呼び出しがO_NONBLOCKでエラーを返さないことを意味しますerrno==EWOULDBLOCK。[「次」は上記の私の解釈であることに注意してください。]

この解釈を認めれば、2 つの同時select呼び出しが両方とも同じ FD を読み取り可能として返す可能性があります。実際には、それらが並行していなくても、最初のスレッドがselect一部の FD を読み取り可能な状態で呼び出し、後で2 つの間でread呼び出す 2 番目のスレッドselectが FD を 2 番目のスレッドで読み取り可能なものとして返す可能性があります。

質問の「目覚める」部分に関連する部分は次のとおりです。

選択された記述子のいずれも要求された操作の準備ができていない場合、pselect() または select() 関数は、要求された操作の少なくとも 1 つの準備が整うまで、タイムアウトが発生するまで、またはシグナルによって中断されるまでブロックされます。

ここで明らかに、上記の解釈は、同時に待機している呼び出しがすべて返されることを示唆しています。

于 2013-09-24T14:08:16.553 に答える
7

I just found a bug because of this question: I have two threads selecting on the same socket, and will call accept when the fd comes back as isset(). In fact the select comes back for both threads, the fd isset() for that fd in both threads, and both threads call accept(), one wins and the other blocks waiting for another connection to come in.

So in fact select will return in all threads that it is blocking on for the same fd.

于 2016-05-25T14:49:48.620 に答える
4

それらはすべてウェイクアップし、すべて同じ結果値を返し、すべてが FD セットに対して同じことを行う必要があります。彼らは皆同じ​​質問をしているので、全員が同じ答えを得るはずです。

ここselect()で引用されている POSIX ドキュメントと、私のわずか 25 年の経験によると、その時点で読み取り可能、書き込み可能などの FD の数を返すことになっています。したがって、すべての同時select()呼び出しがすべて同じものを返さないというのは完全に正しくありません。

このselect()関数は未来を予測することはできません。つまり、どのスレッドが実際に読み取りまたは書き込みを行うのか、したがってどのスレッドがそれで成功するのかを予測することはできません。彼らは主張します。それは群れの問題です。

于 2013-09-19T10:03:13.490 に答える