ITインフラ技術の実験室ITインフラ技術の実験室Linuxを中心に、仮想化やネットワーク、Windowsまで、ITインフラ技術に関するノウハウを幅広く紹介します。前回紹介したマルチプロセスではクライアントからの接続があるたびに子プロセスを生成していました。今回紹介するマルチスレッドではクライアントからの接続があるたびにスレッドを生成します。マルチプロセスが送受信処理を子プロセスに任せていたのと同様に、送受信処理をスレッドに任せればよいため、シンプルで分かりやすいコードになります。具体的には、マルチプロセスでfork()により並列処理を開始したように、マルチスレッドではpthread_create()関数で並列処理を開始します。pthread_create()は呼び出しスレッドと並行して実行する新しい制御スレッドを生成します。pthread_create()にスレッドとして生成したい関数を指定し、その指定された関数から別スレッドになります。引数start_routine()関数を新しいスレッドとして生成し、start_routine()の第一引数として引数argを指定できます。start_routineから返ることで終了します。引数attrにはその新しいスレッドに適用するスレッド属性を指定します。スレッド属性について詳細は割愛しますが、NULLを指定すると合流可能・デフォルトのスケジューリング方式になります。※詳しくはPTHREAD_ATTR_INITについて調べてみてください。スレッドの生成に成功すると新しく作成したスレッドの識別子が引数threadの指す領域へ格納され、0が返ります。エラーコードが返ります。前回取り上げた各方式のメリットとデメリットのうち、マルチスレッドについて再度以下に掲載します。以下の例では、accept()で接続受付を行った後、pthread_create()で送受信専用の関数(send_recv_thread())をスレッド関数として生成しています。スレッド生成後、呼び出し元のスレッドはループの先頭に戻って再度acceptで接続を待ちます。送受信処理の終了後にアクセプトソケットのクローズを行う必要がありますが、スレッド終了後に呼び出し元のスレッドでクローズするのは大変なので、スレッド側でクローズを行えるように、アクセプトソケット(acc)をsend_recv_thread()に渡しています。マルチプロセスではwait()しないとリソースが開放されませんでしたが、同様にマルチスレッドではpthread_join()で終了状態を得ないとリソースが開放されません。以下のソースで実施しているように、send_recv_thread()でpthread_detach()を行うと、スレッドの資源は終了した時に直ちに解放されるようになります(ただし、pthread_joinで終了状態を得られなくなります)。それではコード例を載せます。実際はincludeも必要ですが割愛しています。socket→bind→listenを実行する関数。送受信処理を実施する関数。コメントをキャンセルメールアドレスが公開されることはありません。