linuxマルチスレッドpthread_create


LinuxシステムのマルチスレッドはPOSIXスレッドインタフェースに従い、pthreadと呼ばれる
 
#include /*機能:スレッドパラメータの作成:thread_id:スレッド識別子へのポインタattr:スレッド属性を設定し、NULLはデフォルト属性start_routine:スレッド実行関数へのポインタarg:スレッド実行関数のパラメータ戻り値:成功:0失敗:エラーコード*/int pthread_create(pthread_t *restrict thread_id, const pthread_attr_t *restrict attr, void *(*start_routine)(void *), void *restrict arg);
fork()呼び出しでプロセスを作成する方法とは異なり、pthread_create()作成されたスレッドは、メインスレッド(すなわちpthread_create()を呼び出すスレッド)と同じ実行シーケンスを備えず、start_を実行させるroutine(arg))関数.
thread_id作成したスレッドIDを返す
attr , ( )。 , :

__detachstateは、新しいスレッドがプロセス内の他のスレッドと同期していないかどうかを示し、セットされている場合、新しいスレッドはpthread_を使用できません.join()は同期し、終了時に占有されたリソースを自動的に解放します.デフォルトはPTHREAD_CREATE_JOINABLE状態.このプロパティは、スレッドの作成と実行後にpthread_を使用することもできます.detach()で設定し、PTHREAD_に設定するとCREATE_DETACHステータス(作成時設定でも実行時設定でも)はPTHREAD_に復元できません.CREATE_JOINABLE状態.
__schedpolicyは、新しいスレッドのスケジューリングポリシーを表し、主にSCHED_を含む.OTHER(通常、非リアルタイム)、SCHED_RR(リアルタイム、ローテーション)およびSCHED_FIFO(リアルタイム、先入先出)の3種類、デフォルトはSCHED_OTHER、後の2つのスケジューリングポリシーはスーパーユーザーにのみ有効です.実行時にpthread_を使用できますsetschedparam()を変更します.
__schedparam,struct sched_param構造、現在sched_は1つしかありませんpriority整数変数は、スレッドの実行優先度を表します.このパラメータは、スケジューリングポリシーがリアルタイム(すなわち、SCHED_RRまたはSCHED_FIFO)である場合にのみ有効であり、実行時にpthread_setschedparam()関数を変更します.デフォルトは0です.
__Inheritsched、PTHREAD_の2つの値から選択できます.EXPLICIT_SCHEDとPTHREAD_INHERIT_SCHEDは、新しいスレッドがスケジューリングポリシーとスケジューリングパラメータ(すなわちattrの値)を明示的に指定することを表し、後者は呼び出し元スレッドの値を継承することを表す.デフォルトはPTHREAD_EXPLICIT_SCHED.
__scopeは,スレッド間競合CPUの範囲,すなわちスレッド優先度の有効範囲を表す.POSIXの規格では2つの値が定義されています.PTHREAD_SCOPE_SYSTEMとPTHREAD_SCOPE_PROCESSは、前者はシステム内のすべてのスレッドとCPU時間を競合することを示し、後者は同プロセス内のスレッドのみとCPUを競合することを示す.現在LinuxThreadsではPTHREAD_しか実現していませんSCOPE_SYSTEMの値.
pthread_attr_t構造にはいくつかの値がありますが、pthread_は使用されません.作成()で設定します.
これらの属性を設定するために、POSIXはpthread_を含む一連の属性設定関数を定義した.attr_init()、pthread_attr_destroy()と各属性に関連するpthread_attr_get---/pthread_attr_set---関数.
 
pthread_create()の戻り値は、スレッドの作成に成功したかどうかを示します.よくあるエラーの戻りコードはEAGAINとEINVALです.前者は、システムが新しいスレッドの作成を制限していることを示します.例えば、スレッドの数が多すぎます.後者は、2番目のパラメータが表すスレッド属性値が不正であることを示します.
 
argはvoid*タイプの変数ですが、start_に任意のタイプのパラメータとして渡すこともできます.义齿同時にstart_routine()はvoid*タイプの戻り値を返すことができ、この戻り値は他のタイプでpthread_join()取得.