Linuxスレッド(1)スレッド作成


1.スレッド
スレッドは軽量化されたプロセスであり、プロセスとスレッドの詳細な概念については、次を参照してください.
プロセスとスレッド
スレッドはプロセスよりも制御やスケジューリングが柔軟で、同じプロセスの複数のスレッドが同じアドレス空間を共有するため、Text Segment、Data Segmentは共有されている.1つの関数を定義すれば、各スレッドで呼び出すことができ、1つの全局所変数を定義すれば、各スレッドでアクセスできる.各スレッドは、次のプロセスリソースと環境も共有します.
  • ファイル記述子テーブル
  • 各信号の処理方式(SIG_IGNSIG_DFLまたはカスタム信号処理関数)
  • .
  • 現在の作業ディレクトリ
  • ユーザidおよびグループid
  • ただし、一部のリソースはスレッドごとに1つずつあります.
  • スレッドid
  • コンテキストは、様々なレジスタの値、プログラムカウンタ、およびスタックポインタ
  • を含む.
  • スタック空間
  • errno変数
  • 信号シールド
  • スケジューリング優先度
  • 2.スレッドの作成
    Linuxでスレッドを作成するにはpthread_が必要ですcreate関数:
    #include <pthread.h>
    
    int pthread_create(pthread_t *restrict ptid,
    	const pthread_attr_t *restrict attr,
    	void *(*start_routine)(void*), void *restrict arg);

    ヘッダファイル:pthread.h
    戻り値:
    成功:0
    失敗:errno
    エラー番号はerrnoに格納されます
    パラメータ解析:
    ptid:スレッドid
    attr:スレッドプロパティ、この章ではスレッドプロパティについて詳しく説明しません
        start_routine:スレッドエントリ関数、スレッド起動時に自動的に実行する.注意戻り値はvoid*です.これは関数ポインタです.関数ポインタについてはC関数ポインタを参照してください.
    start_routineが戻ると、このスレッドは終了し、他のスレッドはpthread_joinを呼び出してstart_routineの戻り値を得ることができる.
        arg:start_routineのパラメータ、注意そのタイプはvoid*
    簡単な例です.
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <pthread.h>
    #include <unistd.h>
    
    pthread_t ntid;
    
    void printids(const char *s)
    {
    	pid_t      pid;
    	pthread_t  tid;
    
    	pid = getpid();
    	tid = pthread_self();
    	printf("%s pid %u tid %u (0x%x)
    ", s, (unsigned int)pid, (unsigned int)tid, (unsigned int)tid); } void *thr_fn(void *arg) { printids(arg); return NULL; } int main(void) { int err; err = pthread_create(&ntid, NULL, thr_fn, "new thread: "); if (err != 0) { fprintf(stderr, "can't create thread: %s
    ", strerror(err)); exit(1); } printids("main thread:"); sleep(1); return 0; }

    関数の実行結果:
    $ gcc main.c -lpthread
    $ ./a.out
    main thread: pid 7398 tid 3084450496 (0xb7d8fac0)
    new thread:  pid 7398 tid 3084446608 (0xb7d8eb90)

    注意:マルチスレッドプログラミングはlibpthreadライブラリを使用する必要があるため、コンパイル時に-lpthreadを追加する必要があります.
    pid():プロセスidを取得し、
    pthread_self():スレッドidを取得します.
    3.スレッドの終了
    3.1スレッドを終了し、プロセスを終了しない
    (1)スレッド関数returnから.この方法はメインスレッドには適用されず、main関数returnからexitを呼び出すことに相当する.
    (2)あるスレッドは、pthread_cancelを呼び出して同じプロセス内の別のスレッドを終了することができる.
    (3)スレッドはpthread_exitを呼び出して自分自身を終了させることができる.
    pthread_exit
    #include <pthread.h>
    
    void pthread_exit(void *value_ptr);

    ヘッダファイル:pthread.h
    戻り値:void
    パラメータ解析:value_ptrvoid *のタイプであり、他のスレッドはpthread_joinを呼び出してこのポインタを得ることができる.
    注意:pthread_exitまたはreturnが返すポインタが指すメモリユニットは、グローバルであるか、mallocで割り当てられている必要があります.
    pthread_jion
    #include <pthread.h>
    
    int pthread_join(pthread_t tid, void **value_ptr);

    ヘッダファイル:pthread.h
    戻り値:
    成功:0
    失敗:errno
    パラメータ解析:tid:終了したスレッドid
    value_ptr:終了状態.
    関数を呼び出すスレッドは、idがthreadのスレッドが終了するまで待機します.
    value_ptr:(1)tidスレッドはreturnで戻り、**value_ptr=tidは値を返します.(2)tidスレッドが別のスレッドによって呼び出されるpthread_キャンセル異常終了、*value_ptr=PTHREAD_CANCELED. (3)tidスレッドは自己呼び出しpthread_exit終了、value_ptrが指すセルはpthread_に渡されるexitのパラメータ.
    3.2 thread detach
    一般に、スレッドが終了すると、その終了状態は、他のスレッド呼び出しpthread_joinが取得するまで保持される.しかし、スレッドはdetach状態に設定することもでき、このようなスレッドが終了すると、終了状態を保持せずに使用したすべてのリソースをすぐに回収することができる.すでにdetach状態にあるスレッドに対してpthread_joinを呼び出すことはできません.このような呼び出しはEINVALを返します.まだdetachされていないスレッド呼び出しpthread_joinまたはpthread_detachは、スレッドをdetach状態にすることができる.すなわち、同じスレッドに対してpthread_joinを2回呼び出すことができないか、またはpthread_detachを1つのスレッドに対して呼び出した場合、pthread_joinを呼び出すことができない.
    #include <pthread.h>
    
    int pthread_detach(pthread_t tid);

    戻り値:0が正常に返され、エラー番号が返されませんでした.
    4.参考文献
    Linux Cプログラミングワンストップ学習