Linuxスレッド(1)スレッド作成
1.スレッド
スレッドは軽量化されたプロセスであり、プロセスとスレッドの詳細な概念については、次を参照してください.
プロセスとスレッド
スレッドはプロセスよりも制御やスケジューリングが柔軟で、同じプロセスの複数のスレッドが同じアドレス空間を共有するため、Text Segment、Data Segmentは共有されている.1つの関数を定義すれば、各スレッドで呼び出すことができ、1つの全局所変数を定義すれば、各スレッドでアクセスできる.各スレッドは、次のプロセスリソースと環境も共有します.ファイル記述子テーブル 各信号の処理方式( .現在の作業ディレクトリ ユーザidおよびグループid ただし、一部のリソースはスレッドごとに1つずつあります.スレッドid コンテキストは、様々なレジスタの値、プログラムカウンタ、およびスタックポインタ を含む.スタック空間 信号シールド スケジューリング優先度 2.スレッドの作成
Linuxでスレッドを作成するにはpthread_が必要ですcreate関数:
ヘッダファイル:pthread.h
戻り値:
成功:0
失敗:errno
エラー番号はerrnoに格納されます
パラメータ解析:
ptid:スレッドid
attr:スレッドプロパティ、この章ではスレッドプロパティについて詳しく説明しません
start_routine:スレッドエントリ関数、スレッド起動時に自動的に実行する.注意戻り値はvoid*です.これは関数ポインタです.関数ポインタについてはC関数ポインタを参照してください.
start_routineが戻ると、このスレッドは終了し、他のスレッドは
arg:start_routineのパラメータ、注意そのタイプはvoid*
簡単な例です.
関数の実行結果:
注意:マルチスレッドプログラミングはlibpthreadライブラリを使用する必要があるため、コンパイル時に-lpthreadを追加する必要があります.
pid():プロセスidを取得し、
pthread_self():スレッドidを取得します.
3.スレッドの終了
3.1スレッドを終了し、プロセスを終了しない
(1)スレッド関数returnから.この方法はメインスレッドには適用されず、main関数returnからexitを呼び出すことに相当する.
(2)あるスレッドは、pthread_cancelを呼び出して同じプロセス内の別のスレッドを終了することができる.
(3)スレッドはpthread_exitを呼び出して自分自身を終了させることができる.
pthread_exit
ヘッダファイル:pthread.h
戻り値:void
パラメータ解析:
注意:
pthread_jion
ヘッダファイル: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
一般に、スレッドが終了すると、その終了状態は、他のスレッド呼び出し
戻り値:0が正常に返され、エラー番号が返されませんでした.
4.参考文献
Linux Cプログラミングワンストップ学習
スレッドは軽量化されたプロセスであり、プロセスとスレッドの詳細な概念については、次を参照してください.
プロセスとスレッド
スレッドはプロセスよりも制御やスケジューリングが柔軟で、同じプロセスの複数のスレッドが同じアドレス空間を共有するため、Text Segment、Data Segmentは共有されている.1つの関数を定義すれば、各スレッドで呼び出すことができ、1つの全局所変数を定義すれば、各スレッドでアクセスできる.各スレッドは、次のプロセスリソースと環境も共有します.
SIG_IGN
、SIG_DFL
またはカスタム信号処理関数)errno
変数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_ptr
はvoid *
のタイプであり、他のスレッドは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プログラミングワンストップ学習