ホームページ >運用・保守 >Linuxの運用と保守 >Linux マルチスレッド プログラミングの知識ポイントは何ですか?

Linux マルチスレッド プログラミングの知識ポイントは何ですか?

WBOY
WBOY転載
2023-05-25 11:01:12830ブラウズ

Linux スレッドは 2 つのカテゴリに分類されます。1 つはコア レベルのサポート スレッド、もう 1 つはユーザー レベルのスレッドです。通常、これらはユーザーレベルのスレッドです。

1. マルチスレッドのいくつかの一般的な機能

マルチスレッドを作成するには、pthread.h ファイルとライブラリ ファイル pthread をロードする必要があります。スレッド識別子 pthread_t はヘッダー ファイル /usr/include/bits/pthreadtypes.h: typedef unsigned long int pthread_t

1 で定義されています。スレッドを作成します:

int pthread_create(pthread_t *restrict thread ,
const pthread_attr_t *restrict attr,
void *(*start_routine)(void*), void *restrict arg);
パラメータ:
thread输出線程id
attr 線程プロパティ、默认null
start_routine スレッド実行関数
arg スレッド実行パラメータ
注: この関数は正常に 0 を返しますが、それ以外の場合はエラー コード

2 を返します。指定されたスレッド:

int pthread_join(pthread_t thread,void **value_ptr);
パラメータ:
threadA 有効なスレッド ID
value_ptr スレッドの戻り値を受け取るポインター
note: この関数を呼び出すスレッドは、指定されたスレッドが一時停止状態になるか、終了する前にエラーで直接戻ります。value_ptr が null でない場合、value_ptr はスレッドの戻り値のポインタを指します。指定されたスレッドは、関数が成功した後に解放されます。

3. スレッドを終了します:

int pthread_exit(void * value_ptr);
パラメータ:
value_ptr スレッド戻り値ポインター
注意: ptrhead_exit () この関数を呼び出したスレッドを終了し、スレッドが占有しているリソースを解放します。

4. 現在のスレッド ID を取得します:

pthread_t pthread_self(void);
パラメータ:
注: 現在の関数の ID を返します

5. ミューテックス

ミューテックスを作成します:
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);
パラメータ:
ミューテックス出力ミューテックス ID
attr ミューテックス属性、デフォルト null
注: 関数は正常に 0 を返します。それ以外の場合は、エラー コードを返します。
ミューテックスをロックする:
int pthread_mutex_lock(pthread_mutex_t *mutex) ;
パラメータ:
ミューテックス ミューテックス ID
注: 指定されたミューテックス ID がロックされている場合、呼び出しスレッドはミューテックス ID が完全にロック解除されるまで一時停止状態のままになります。それ以外の場合、ミューテックスはロックされます。
int pthread_mutex_trylock(pthread_mutex_t *mutex);
Parameters:
mutex mutex id
note: 指定したミューテックス ID がロックされている場合は、直接エラーが返りますので、このエラーを判断して別の処理を行います。 pthread_mutex_trylock は pthread_mutex_lock に似ていますが、pthread_mutex_trylock はミューテックスがロックされている場合にのみブロックする点が異なります。
Unlock mutex:
int pthread_mutex_unlock(pthread_mutex_t *mutex);
Parameter:
mutex mutex id
note: 指定されたミューテックス ID がロックされている場合は、ロックを解除します
ミューテックスを解放します:
int pthread_mutex_destroy(pthread_mutex_t *mutex);
Parameters:
mutex mutex id
note: 指定されたミューテックスによって占有されているリソースを解放します。
関数 pthread_mutex_init と pthread_mutex_destroy は、それぞれミューテックス ロックのコンストラクターとデストラクターです。

2. マルチスレッド同期

1. ミューテックス

ミューテックスはロックに相当し、以下の 3 点を保証できます。
◎原子性: スレッドがミューテックスをロックすると、クリティカル セクションのすべての操作が完了するか、まったく実行されなくなります。
◎一意性: スレッドがミューテックスをロックすると、ロックを解除するまで他のスレッドはミューテックスをロックできません。
◎非ビジー待機: スレッドがミューテックスをロックし、2 番目のスレッドがミューテックスをロックしようとすると、スレッドがミューテックスのロックを解除するまで、2 番目のスレッドは (CPU リソースを占有せずに) 一時停止されます。

2. 条件変数

条件変数は、スレッドが (CPU を消費せずに) 特定のイベントが発生するまで待機できるようにするメカニズムです。一部のスレッドは、他のスレッドが条件変数にシグナルを送信するまで条件変数を待機する場合があり、その時点でこれらのスレッドの 1 つが起動してイベントを処理します。ただし、条件変数はロックを提供しないため、この環境変数にアクセスするときに必要なロックを提供するには、ミューテックスとともに使用する必要があります。
3. セマフォ
ダイクストラはセマフォの概念を提案しました。セマフォは正の整数値のみを取ることができる特別な変数です。この正の整数に対して実行できる操作は 2 つだけです: p 操作 (待機を表す) 、off 操作) および v 操作 (信号を表す、操作時)。
p/v 演算は次のように定義されます (セマフォ sem があると仮定します):
p(sem): sem の値が 0 より大きい場合、sem は 1 減らされます。 sem が 0 の場合はスレッドです。
v(sem): sem を待って中断されている他のプロセスがある場合は、実行を再開します。sem を待って中断されているスレッドがない場合は、sem が 1 増加します。
シグナルセットの作成とオープン
int semget(key_t key,int nsems,int flag);
セマフォの操作
int semop(int semid,struct sembuf semoparray[],size_t nops );
セマフォの制御
int semctl(int semid,int semnum int cmd,union semun arg);
添付ファイル: 古典的な生産者と消費者の問題 (生産者と消費者) は、有名な同期の問題です。

以上がLinux マルチスレッド プログラミングの知識ポイントは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。