#include "pthread.hの" の#include "implement.h" int型の pthread_attr_init(のpthread_attr_t * attrの) / * * -------------------------- ---------------------------- * DOCPUBLIC *スレッドがデフォルトで属性オブジェクトを初期化します *属性。 * * PARAMETERS * ATTR のpthread_attr_tのインスタンスへのポインタ* * * *説明 *スレッドは、デフォルトでオブジェクト属性初期化 *属性。 * *注意: * 1)スレッド属性を定義するために使用します * *結果 * 0正常に初期化のattr、 attrのための* ENOMEMメモリ不足。 * * ------------------------------------------------ ------ * / { のpthread_attr_t attr_result。 IF(ATTR == NULL) { / *これは、許可されています。* / EINVALを返します。 } attr_result =(のpthread_attr_t)はmalloc(はsizeof(* attr_result))。 IF(attr_result == NULL) { 戻りENOMEM。 } の#ifdef _POSIX_THREAD_ATTR_STACKSIZE / * *ゼロサイズに既定。明示的に変更しない限り、 * Win32のは、のそれにサイズを設定することができます *メインスレッド。 * / attr_result->スタックサイズ= 0; #endifの _POSIX_THREAD_ATTR_STACKADDRの#ifdef 、我々はそれをサポートする賢明なものに設定この:/ * FIXME。* / attr_result-> stackaddr = NULL; #endifの //设置线程默认是怎么退出的 attr_result-> detachstate PTHREAD_CREATE_JOINABLE =; #if HAVE_SIGSET_T のmemset(&(attr_result->はsigmask)、0、はsizeof(sigset_t))。 #endifの/ * HAVE_SIGSET_T * / / * * Win32のはTHREAD_PRIORITY_NORMALに新しいスレッドを設定して いない親スレッドのものに*。我々はをデフォルトに選択した この配置*。 * /
attr_result-> param.sched_priority = THREAD_PRIORITY_NORMAL。 attr_result-> inheritsched = PTHREAD_EXPLICIT_SCHED。 attr_result-> contentionscope = PTHREAD_SCOPE_SYSTEM。 attr_result->有効= PTW32_ATTR_VALID。 * ATTR = attr_result。 0を返します。 }
#include " pthread.hの" の#include " implement.h " #ifndefの_UWIN の#include <process.h> #endifの int型 のpthread_create(がpthread_t * TID、 CONSTのpthread_attr_t * attrの、 無効 *(*スタート)(無効 *)、無効 * 引数) / * * -------------------------------------------- ---------- * DOCPUBLIC *この機能は、スタート機能を実行するスレッドを作成し 、それをパラメータ値を渡し、「引数」*。「ATTR」 *引数指定するオプションの作成属性。 *新しいスレッドのアイデンティティが返される NULLであってはならない「TID」を介して*を、。 * *パラメータ * TID *がpthread_tのインスタンスへのポインタ * * attrの のpthread_attr_tのインスタンスへのポインタ*オプション * *開始 *新しいスレッドの開始ルーチンへのポインタ * *引数 *オプションのパラメータは「開始」に渡されました * * * DESCRIPTION *この機能は、スタート機能を実行するスレッドを作成し *それをパラメータ値、「引数」を渡します。「attrの」 *引数指定するオプションの作成属性。 *新しいスレッドのアイデンティティが返される NULLポインタであってはならない「TID」を介して*を、。 * *結果 * 0正常に作成されたスレッド、 * EINVAL attrの無効、 * EAGAINリソース不足。 * * ------------------------------------------------ ------ * / { がpthread_tスレッド。 ptw32_thread_t * TP。 pthread_attr_t登録; HANDLE threadH= 0 ; int型の結果= EAGAIN。 int型実行= PTW32_TRUE。 ThreadParms * PARMS = NULL; 長いSTACKSIZE; int型優先; がpthread_t自己; / * *何かを行う前に、そのTIDをチェックすることによって保存することができ 、メモリ保護エラー(セグメンテーション違反)を呼び出すことなく、*。 *必ず下記の割り当ては、コンパイラによって最適化することはできないことを確認してください。 *これは、条件付きで最後にもう一度* TIDを割り当てることによって保証されています。 * / TID - > X = 0 。 もし NULL) {(ATTR =!= * ATTR; } そうでなければ { A = NULL; } もし、((スレッド= ptw32_new())== P。NULL) { 後藤FAIL0; } TP =(ptw32_thread_t * )thread.p、 優先順位 = TP - > sched_priorityは、もし((PARMS =(ThreadParms *)はmalloc(はsizeof(* PARMS)))== NULL) { 後藤FAIL0; } PARMS - > TID = スレッド; PARMS - >開始= 始めます。 PARMSは - >引数=argを。 #ifの定義された(HAVE_SIGSET_T)/ * *スレッドはそのクリエーターのスレッドから初期のsigmaskを継承します。* / 自己 = pthread_self()。 TP - >のsigmask =((ptw32_thread_t *)self.p) - > はsigmask。#endifの / * HAVE_SIGSET_T * / 場合(!= NULL) { STACKSIZE = A-> スタックサイズ。 TP - > detachState = A-> detachstate。 優先 = A-> param.sched_priority。#if(THREAD_PRIORITY_LOWEST> THREAD_PRIORITY_NORMAL) / * ひるみ* / #elseの / * 他のすべて* / / * *スレッドの優先順位は、有効なシステムレベルに設定する必要があります )(は、pthread_attr_setschedparamで値セットを変更することなく、*。 * / / * Win32のスレッドがあるため* PTHREAD_EXPLICIT_SCHEDはデフォルトです *その作成者の優先順位を継承しません。彼らは、使用を開始している * THREAD_PRIORITY_NORMAL(Win32の値)。供給しない結果 のpthread_createに*「ATTR」argは()をデフォルトに相当する * PTHREAD_EXPLICIT_SCHED優先THREAD_PRIORITY_NORMAL。 * / 場合(PTHREAD_INHERIT_SCHED == A-> inheritsched) { / * *のpthread_create()と呼ばれるそのスレッドは、Win32スレッドである場合は 、次に継承優先順位が一時的なの結果である可能性があります* *システムの調整。これは、POSIXスレッドには当てはまりません。 * / の#if!定義(HAVE_SIGSET_T) 自己 = pthread_self()。 #endifの 優先度 =((ptw32_thread_t *)self.p) - > sched_priorityは。 } #endifの } 他 { / * *デフォルトSTACKSIZE * / スタックサイズ = PTHREAD_STACK_MIN。 } TP - >状態=実行?PThreadStateInitial:PThreadStateSuspended。 TP - >キー= NULL; / * *スレッドは中断モードで起動する必要がありますし、場合に必要再開 _beginthreadex戻ったちハンドルの後に*を。そうしないと我々はセットアップ の作成と作成したスレッド間*競合状態を。 *我々はまた、使用するためのハンドルのローカルコピーを保持することを注記 する場合には、当社が* thread.p-> threadH後にNULL化されますが、我々はしました前 *ここに仕上げました。 * / の#if!定義された(__MINGW32__)|| 定義された(__MSVCRT__)|| 定義(__DMC__) TP - > threadH = threadH = (HANDLE)_beginthreadex((ボイド*)NULL、 / * なしセキュリティ情報 * / (符号なし)STACKSIZE、 / * デフォルトのスタックサイズ * / ptw32_threadStart、 PARMS、( 符号なし) CREATE_SUSPENDED、 (符号なし *)&(TP-> スレッド)); もし(!threadH = 0 ) { 場合(!= NULL) { (ボイド)ptw32_setthreadpriority(スレッド、SCHED_OTHER、優先); } 場合(ラン) { のResumeThread(threadH)。 } } の#else / * __MINGW32__ &&!__MSVCRT__ * / / * *このロックは、我々が持っているまで待つことpthread_threadStartを()を強制します *スレッドハンドルをして優先度を設定しています。* / (無効)はpthread_mutex_lock(&TP-> cancelLock); TP - > threadH = threadH = //线程创建最终调用了这个函数 (HANDLE)_beginthread(ptw32_threadStart、(符号なし)STACKSIZE、 / * デフォルトのスタックサイズ * / PARMS)。/ * *リターンコード一致_beginthreadexのを確認します。* / 場合(threadH ==(HANDLE) - 1L ) { TP - > threadH = threadH = 0 。 } 他 { 場合(!RUN) { / * * beginthread我々は今それを行うので、フラグを作成することができません。 *自分自身をbeginthread注SUSPENDEDでスレッド作成 *モードを、それを開始するためのResumeThreadを呼び出します。 * / SuspendThread(threadH)。 } もし(!= NULL) { (ボイド)ptw32_setthreadpriority(スレッド、SCHED_OTHER、優先); } } (ボイド)pthread_mutex_unlockの(&TP->cancelLock); #endifの / * __MINGW32__ &&!__MSVCRT__ * / 結果 =(threadH!= 0)?0 :EAGAIN。 / * *意図的に通って落下 * / / * * ------------ *故障コード * ------------ * / FAIL0: もし(!結果= 0 ) { ptw32_threadDestroy(スレッド)。 TP = NULL; もし(!PARMS = NULL) { 無料(PARMS)。 } } 他 { スレッド。* TID = } _UWINの#ifdef 場合(結果== 0 ) pthread_count ++ 。 #endifのの リターン(結果)。 }