1. C / C ++マルチスレッド操作手順
C / C ++マルチスレッドの基本的な操作は次のとおりです。
- スレッド確立の終了
- スレッドの相互除外と同期
- セマフォを使用してスレッドを制御する
- スレッドの基本的な属性構成
マルチスレッドメカニズムを使用してC / C ++コードを作成する場合、最初に行う必要があるのは、次のように参照を宣言することです。
#include "pthread.h"
2.
基本的なスレッド操作方法基本的なスレッド操作:
-
pthread_create():スレッドを作成し、関連するスレッド関数の実行を開始し、スレッドが終了したら終了します
-
pthread_eixt():exit()はプロセスを終了するために使用されるため、特定のスレッド終了関数を使用する必要があります
-
pthread_join():現在のスレッドを一時停止して、ブロック方式でスレッドの終了を待機し、スレッドが終了した場合はすぐに戻ります。0=成功
-
pthread_cancel():終了信号をスレッドスレッドに送信し、成功した場合は0を返しますが、成功したからといってスレッドが終了するわけではありません。
-
pthread_testcancel():キャンセルポイントが含まれていないが、キャンセルポイントが含まれていないコード実行スレッドでキャンセル要求に応答するために、キャンセルポイントが必要なキャンセルポイントを作成します。
-
pthread_setcancelstate():このスレッドの応答をキャンセルスレッドに設定します
-
pthread_setcanceltype():キャンセル状態を設定して、次のキャンセルポイントまで実行を継続し、終了するか、キャンセルアクションをすぐに実行します
-
pthread_setcancel():キャンセルステータスを設定します
3.スレッド相互排除および同期メカニズム
基本的な相互排除および同期操作方法:
-
pthread_mutex_init():ミューテックスロックの初期化
-
pthread_mutex_lock():ミューテックスをロックします。ロックされているミューテックスをロックしようとすると、使用可能になるまでブロックされます。
-
pthread_mutex_trylock():ノンブロッキングロックミューテックス
-
pthread_mutex_unlock():ミューテックスロックを解除します
-
pthread_mutex_destory():ミューテックスロック破壊関数
4つのマルチスレッドプラクティス
- 基本的なスレッドと確立および操作
次のコードは、最も基本的なpthread.hを使用してC / C ++によって開発された基本的なスレッド操作です。
/* thread.c */
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define THREAD_NUMBER 3 /*线程数*/
#define REPEAT_NUMBER 5 /*每个线程中的小任务数*/
#define DELAY_TIME_LEVELS 10.0 /*小任务之间的最大时间间隔*/
//
void *thrd_func(void *arg) {
/* 线程函数例程 */
int thrd_num = (int)arg;
int delay_time = 0;
int count = 0;
printf("Thread %d is starting\n", thrd_num);
for (count = 0; count < REPEAT_NUMBER; count++) {
delay_time = (int)(rand() * DELAY_TIME_LEVELS/(RAND_MAX)) + 1;
sleep(delay_time);
printf("\tThread %d: job %d delay = %d\n", thrd_num, count, delay_time);
}
printf("Thread %d finished\n", thrd_num);
pthread_exit(NULL);
}
int main(void) {
pthread_t thread[THREAD_NUMBER];
int no = 0, res;
void * thrd_ret;
srand(time(NULL));
for (no = 0; no < THREAD_NUMBER; no++) {
/* 创建多线程 */
res = pthread_create(&thread[no], NULL, thrd_func, (void*)no);
if (res != 0) {
printf("Create thread %d failed\n", no);
exit(res);
}
}
printf("Create treads success\n Waiting for threads to finish...\n");
for (no = 0; no < THREAD_NUMBER; no++) {
/* 等待线程结束 */
res = pthread_join(thread[no], &thrd_ret);
if (!res) {
printf("Thread %d joined\n", no);
} else {
printf("Thread %d join failed\n", no);
}
}
return 0;
}
ルーチンは3回ループして3つのスレッドを作成し、pthread_join関数を使用してスレッドが順番に終了するのを待ちます。
スレッドはrand()を使用してランダムな値を取得し、ランダムに5回スリープします。実行されたスレッドは、ランダムに発生した後に最初に実行されます。
実行結果:
$ gcc thread.c -lpthread
$ ./a.out
Create treads success
Waiting for threads to finish...
Thread 0 is starting
Thread 1 is starting
Thread 2 is starting
Thread 1: job 0 delay = 2
Thread 1: job 1 delay = 2
Thread 0: job 0 delay = 8
Thread 2: job 0 delay = 10
Thread 2: job 1 delay = 3
Thread 1: job 2 delay = 10
Thread 0: job 1 delay = 8
Thread 0: job 2 delay = 3
Thread 0: job 3 delay = 1
Thread 2: job 2 delay = 8
Thread 1: job 3 delay = 8
Thread 1: job 4 delay = 1
Thread 1 finished
Thread 2: job 3 delay = 6
Thread 0: job 4 delay = 7
Thread 0 finished
Thread 0 joined
Thread 1 joined
Thread 2: job 4 delay = 10
Thread 2 finished
Thread 2 joined
スレッド1はスレッド0の前に実行されますが、pthread_joinの呼び出し時系列は、スレッド0の実行を待機することです。
スレッド1が早期に終了したため、スレッド0がpthread_joinによって待機されると、スレッド1は終了し、スレッド1の場合、直接戻ります。
- スレッド実行の相互除外と同期pthread_mutex_lock
次に、上記のプログラムにミューテックスロックを追加します。
/*thread_mutex.c*/
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#define THREAD_NUMBER 3 /* 线程数 */
#define REPEAT_NUMBER 3 /* 每个线程的小任务数 */
#define DELAY_TIME_LEVELS 10.0 /*小任务之间的最大时间间隔*/
pthread_mutex_t mutex;
void *thrd_func(void *arg) {
int thrd_num = (int)arg;
int delay_time = 0, count = 0;
int res;
/* 互斥锁上锁 */
res = pthread_mutex_lock(&mutex);
if (res) {
printf("Thread %d lock failed\n", thrd_num);
pthread_exit(NULL);
}
printf("Thread %d is starting\n", thrd_num);
for (count = 0; count < REPEAT_NUMBER; count++) {
delay_time = (int)(rand() * DELAY_TIME_LEVELS/(RAND_MAX)) + 1;
sleep(delay_time);
printf("\tThread %d: job %d delay = %d\n",
thrd_num, count, delay_time);
}
printf("Thread %d finished\n", thrd_num);
/****互斥锁解锁***/
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
int main(void) {
pthread_t thread[THREAD_NUMBER];
int no = 0, res;
void * thrd_ret;
srand(time(NULL));
/* 互斥锁初始化 */
pthread_mutex_init(&mutex, NULL);
for (no = 0; no < THREAD_NUMBER; no++) {
res = pthread_create(&thread[no], NULL, thrd_func, (void*)no);
if (res != 0) {
printf("Create thread %d failed\n", no);
exit(res);
}
}
printf("Create treads success\n Waiting for threads to finish...\n");
for (no = 0; no < THREAD_NUMBER; no++) {
res = pthread_join(thread[no], &thrd_ret);
if (!res) {
printf("Thread %d joined\n", no);
} else {
printf("Thread %d join failed\n", no);
}
}
pthread_mutex_destroy(&mutex);
return 0;
}
上記のルーチンに同期ロックpthread_mutex_tを直接
追加します。プログラムがスレッドプログラムを実行しているときに、同期ロックpthread_mutex_tをスレッドに追加し、pthread_mutex_lockを呼び出してロックし、ロックが見つかったらロックを待ち、ロックが再度解放されるのを待ってから再ロックします。
これにより、スレッドプログラムがロードされます。キューで待機し、ロックに成功した後もプログラムコードの実行を続行します。
実行結果は次のとおりです。
Create treads success
Waiting for threads to finish...
Thread 0 is starting
Thread 0: job 0 delay = 7
Thread 0: job 1 delay = 2
Thread 0: job 2 delay = 9
Thread 0 finished
Thread 2 is starting
Thread 0 joined
Thread 2: job 0 delay = 6
Thread 2: job 1 delay = 7
Thread 2: job 2 delay = 10
Thread 2 finished
Thread 1 is starting
Thread 1: job 0 delay = 3
Thread 1: job 1 delay = 5
Thread 1: job 2 delay = 2
Thread 1 finished
Thread 1 joined
Thread 2 joined
(より無料のC / C ++、Linux、Nginx、ZeroMQ、MySQL、Redis、fastdfs、MongoDB、ZK、ストリーミングメディア、CDN、P2P、K8S、Docker、TCP / IP、coroutine、DPDKなどの高度な知識ポイント高度な乾物学習教材とグループ960994558)