質問

私が尋ねようとしていることをすることができるかどうかはよくわかりませんので、私は尋ねたと思いました。

スレッドがメモリブロックを共有して必要な情報を通知するマルチスレッドプログラムがあります。情報の1つは、スレッドが絶えずこの値をチェックし、値が変更されたとき、彼らはその時だと知っているスレッドの終了です。 pthread_exit(). 。スレッドの1つが含まれています listen() 機能とそれは無期限に待つようです。接続したい人がいない場合、スレッドが終了する必要がある場合、これは問題になる可能性がありますが、スレッドが立ち往生しているため終了する必要があるかどうかを確認できません listen() そして、向こうに移動することはできません。

while(1)
{
  listen();
  ...
  if(value == 1)
    pthread_exit(NULL);
}

私の論理は、それが私のポイントをよりよく説明するのに役立つなら、そのようなものです。私が問題を解決すると思ったのは、聴取()が期間待つことを許可することです。何も起こらない場合、次の声明に移行します。残念ながら、の2つの引数のいずれもありません listen() 時間制限が含まれます。マルチスレッドプログラミングで正しい方法を進んでいるかどうかさえわかりませんが、私はまったく経験がありません。それで、これは良いアプローチですか?おそらくそれをやり遂げる良い方法がありますか?洞察に満ちたコメントをありがとう。

編集:少し明確にするために、理由 listen() whileループは、これがサーバーであり、一度に複数のクライアントに接続されることです。

役に立ちましたか?

解決

ソケットを非ブロッキングに設定し、使用してイベントを待ちます 選択する/世論調査 または同様の-Select/Pollを使用すると、タイムアウトを設定できます。

聴取()はブロックしないことに注意してください。それは、着信接続を処理する準備ができているソケットをマークするだけで、accept()が次のステップであり、ブロックされます。

他のヒント

他のスレッド(値を1に変更するスレッド)から信号を送信する必要があります。 EINTRエラーコードを使用して、聞き取り関数が返されます。

IIRCでタイムアウトを設定する必要があります setsockopt(), 、そして後にerrnoを確認します listen() それがタイムアウトなのか深刻なエラーなのかを確認できません。

私には、電話することができるはずです listen() 常に同じ接続ソケットを使用する場合にのみ。しかし、おそらくあなたは同じ問題を抱えています accept().

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top