KB)pthreadはPOSIX仕様に基づく非同期処理の仕組みです。他の非同期処理と比較すると新しい仕組みですが、その奥は深くさまざまな機能を持っています。本稿ではpthreadの概要、プロセスとスレッドの違い、生成方法を解説します。process)と呼ばれたりもします。pthreadはPOSIXが仕様化したスレッドモデルで、POSIX仕様を満たしているOS間では基本的には移植が可能ですが、個人的な感想では、主にUNIX系OSで使用されているようです。便利なんですが、しかし複数のスレッドを矛盾無く動かす事はとても難しく、またデバックも困難で、作りを誤ると環境次第で動きが違ったりします。有用な実装方法はネット上でもそれ程見当たらず、本も少ないうえに英文を強引に訳してるだけの古い本ばかりで、なかなか理解が困難だと思います。当レポートはpthreadに関する調査・試行錯誤した結果、躓きやすい箇所、実装依存と思われる箇所等、独断と偏見と誤解とたくさんのサンプルを記載します。6(2.6.18-1.2798.fc6)、32bit、glibc-2.5-3、gcc-4.1.1-30です。以下のような内容について述べていきます。スレッドの概要、およびスレッドとプロセスの違いについて。スレッド間やプロセスとの同期処理について。スレッド間やプロセスとの条件変数の使用法について。使用したアプリケーションと解説。スレッド独自のデータ作成・管理方法について。スタックサイズの変更法、および影響について。スレッドのスケジューリング設定法、およびその影響や注意点について。スレッドのキャンセル方法、およびその影響や注意点について。スレッドでシグナルを安全に使う方法について。バリアの使用法、mutexattrの種類と動きの違いについて。サンプルプログラムは100行前後程度までは画面に記載します。全プログラムは圧縮してダウンロード可能にしています。makeコマンドでコンパイルできます。プログラムのボリューム上、エラー処理やdestroy処理や引数チェックなどを省いていますが、どうかご容赦ください。ご指摘や質問や調査など大歓迎、可能な限りの対応に努めます。スレッドの概要(1/2)スレッドの意味は、あくまでもコンピュータ上の処理の単位です。バッチプログラムも1つのスレッドです。"マルチ(多重化)"でないスレッドは、"シングルスレッド"と呼べますが、わざわざスレッドと呼ばすに"シングルプロセス"とか"シングルタスク"と呼びます。マルチスレッドとシングルスレッドの違いは何か。マルチタスクとの違いは何か。概念的な話をするよりかは実際のコードとその動きを用いて説明します。以下のアラームプログラムは、一度に一個のアラームしか処理できません。アラームが動いている時は他のアラームを処理できませんし、新規アラームを受け付ける事もできません。このプログラムは"シングルスレッド"および"シングルタスク"と呼ばれる類に属します。0;}このプログラムを非同期にする方法として、例えばプログラム自体を複数分コピーしてしまう事で対応します。アラームをforkする事でアラーム自体は子プロセスで対処し、アラーム受付を親プロセスが行います。元のプログラムに比べてもさほど複雑ではありません。0;}上記プログラムは画面からアラームを受け付けたら子プロセスを起動し、子プロセスがアラーム処理を行っています。複数プロセスが同時にアラーム内容を出力する事になり、出力先が画面だと邪魔臭いので、出力先ファイル名を引数として受け取り、そこにアラーム内容を書き出します。./alarm.log"とすることでアラーム内容をリアルタイムで観察できます。マルチプロセスの場合、子プロセスの終了を親プロセスが検知し適切に処理しなくてはいけません。子プロセスがexitした際に親プロセスへ配信するSIGCHLDを無視する事で対処しています。このプログラムはアラーム処理を"プロセス"が行っています。複数のプロセスが処理を平行して行っていて、つまり"マルチプロセス"化されています。1つ別のアプローチ、スレッドを用いてプログラムを書きます。アラーム処理を行うのがプロセスかスレッドかの違いくらいで、動きおよび引数等だけ見れば、まったく同じです。関数がスレッド本体です。よって生成されたスレッドは第4引数で指定された引数を持って第3引数で指定された関数を起動し、当関数が終了すればスレッドも終了します。関数を呼ぶことで親スレッド(つまり親プロセス)から分離し、勝手に終る事を宣言しています。する事で親プロセスはスレッドの生死を管理しなくてもよくなります。マルチプロセスの場合、子プロセスを起動する際に親プロセスのメモリ情報をそのままコピーしているため、ファイルディスクリプタなどのスタック情報をそのまま使用できますが、スレッドの場合、呼び出し元とは同じメモリ領域で動いては居ますが、スタックが異なるため、呼び出し元(alarm_thread.cで言うところのmain関数)のスタック上の情報は参照できません。よって、わざわざ構造体を用意して渡しています。以降、当レポートではスレッドを「pthread_createによって生成された、親プロセスから分離した処理」という意味で使用します。エイト(エイト)(株)DTSに勤てます。WebアプリやJavaやLL等の上位アプリ環境を密かに憧れつつも、ず~っとLinuxとかHP-UXばかり、ここ数年はカーネル以上アプリ未満のあたりを行ったり来たりしています。mixiもやってまして、こちらは子育てとか日々の日記メインです。圧縮・解凍UNIX基本講座@CodeZine『CodeZine(コードジン)』の公式アカウントです。【NEW】デブスト2019デブサミ2019福岡・関西デブサミ2019夏デブスト関西デブサミ2019×ログインEメールパスワード※旧SEメンバーシップ会員の方は、同じ登録情報(Eメール&パスワード)でログインいただけます。イラストの無断転載を禁じます。記載されているロゴ、システム名、製品名は各社及び商標権者の登録商標あるいは商標です。