2017-09-19 10 views
-1

サーバーソケットを作成したいが、 "accept call"でメインアプリケーションをブロックしたくない。だから私はメインアプリケーションでソケットを作成します。 pthreadメカニズムを使用して、私はそれに "accept call"を使用する新しいスレッドを作成しました。メインアプリケーションにソケットを作成した後、私は「pthread join」と呼ばれました。このスレッドが実行されると、 "accept call"が再びメインアプリケーションをブロックします。私はgdbを使ってチェックしました。この問題についてどうすればいいのですか?新しいスレッドのサーバーソケット

+1

"pthread_join()関数は、ターゲットスレッドが終了するまで、呼び出しスレッドの実行を中断します。"つまり、新しいスレッドが新しい呼び出しを引き続きリッスンするため、メインスレッドをブロックします。詳細については、ここをクリックしてください:[pthread_join](http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_join.html) – Floaterz

+0

それで、pthread_join()を呼び出さずに私のために働くのですか? –

+0

Protip - 選択肢がない限り、pthread_joinを呼び出しません。あなたのケースでは、受け入れループは、今まで必要はありません。 –

答えて

0

メインサーバのソケットディスクリプタをノンブロッキングにしてselect system callを使用する方法もあります。 selectが返ってメインソケットディスクリプタにデータがある場合は、新たに受け入れられた接続を処理するための新しいスレッドを作成します。このようにして並列性を達成することができます。作成された新しい接続には独自のコンテキストがあり、accept()が接続を待つ間も可能な限りスケジュールされます。

+0

accept()ループでselect()を使用しても意味がありません。何も得られず、システムコールを余分に行う必要があります。あなたはselect()がブロッキングコールであることを理解していますか? –

+0

@Naresh。 Martin Jamesが述べたように、選択コールはブロックされています。したがって、メインアプリケーションはブロックされます。私は、メインアプリケーションがブロックしてはならないシナリオを持っています。クライアントがいつ接続するのかわかりません。 –

関連する問題