linuxスレッドpthread_の作成create関数スレッドidの取得

2093 ワード

関数のプロトタイプ:
#include
int  pthread_create(pthread_t*thread,pthread_attr_t   *attr,
void * (*start_routine)(void *arg), void *arg);
 
パラメータ
最初のパラメータは、スレッド識別子を指すポインタです.
2番目のパラメータは、スレッドのプロパティを設定するために使用されます.
3番目のパラメータは、スレッド実行関数のアドレスです.
最後のパラメータは、関数を実行するパラメータです.
 
戻り値:
成功した場合は0を返します.そうでない場合はエラー番号を返します.
コード:
#include 
#include 
#include 

void* Func_pth1()
{
    printf("child gettid = %u
", syscall(SYS_gettid)); printf("child pthread_self= %u
", (unsigned int)pthread_self()); //printf("child thread tid = %u
", pthread_self()); } int main() { int iRet = 0; pthread_t pth1; printf("main gettid = %u
", syscall(SYS_gettid)); printf("main pthread_self = %u
", (unsigned int)pthread_self()); iRet = pthread_create(&pth1, NULL, (void*)Func_pth1, NULL); if(iRet) { printf("create pthread fail
"); } printf("---pthread_t = %u
", (unsigned int)pth1); pthread_join(pth1, NULL); return 0; }

実行結果:
main gettid = 5100 main pthread_self = 3078461120 ---pthread_t = 3078458224 child gettid = 5101 child pthread_self= 3078458224
分析:
1 pthread_self()はPOSIXの実装であり、その戻り値はpthread_である.t,pthread_tはlinuxでは実際には符号なし長整型,すなわちunsigned longである.gettidはシステム呼び出しであり、その戻り値はpid_である.t,linuxでは符号なし整数型である.しかしglibcはこの関数を実現せず,Linuxのシステム呼び出しsyscallでしか取得できない.
2 pthread_selfは,同じプロセスにおける異なるスレッドを区別するためにthreadの実装によって決定される.pthread_selfは、同じプロセス内の各スレッド間の識別番号を返します.このプロセス内では一意ですが、異なるプロセスでは、各スレッドが返すpthread_selfは同じものを返す可能性があります.gettidが取得したスレッドidはpidと関係があり、linuxではスレッドもプロセス(clone)であるため、スレッドIDもpid_tタイプ.1つのプロセスでは、プライマリスレッドのスレッドidとプロセスidは同じであり、そのプロセスの他のスレッドidはlinuxシステム内で唯一であり、gettidは移植できない.
3 LinuxのPOSIXスレッドライブラリで実装されているスレッドは、コードセグメント、データセグメントなど、メインプロセス(スレッドを起動するプロセス)とリソースを共有するプロセス(LWP)でもあります.
スレッドの実際のpidを知る必要がある場合があります.例えば、プロセスP 1が他のプロセスP 2のいずれかのスレッドに信号を送信する場合、P 2のpidもスレッドのpthread idも使用できず、そのスレッドの真のpidのみをtidと呼ぶ.