C / C ++マルチスレッド操作

1. C / C ++マルチスレッド操作手順

C / C ++マルチスレッドの基本的な操作は次のとおりです。

  • スレッド確立の終了
  • スレッドの相互除外と同期
  • セマフォを使用してスレッドを制御する
  • スレッドの基本的な属性構成

マルチスレッドメカニズムを使用してC / C ++コードを作成する場合、最初に行う必要があるのは、次のように参照を宣言することです。

#include "pthread.h"

2.
基本的なスレッド操作方法基本的なスレッド操作:

  1. pthread_create():スレッドを作成し、関連するスレッド関数の実行を開始し、スレッドが終了したら終了します

  2. pthread_eixt():exit()はプロセスを終了するために使用されるため、特定のスレッド終了関数を使用する必要があります

  3. pthread_join():現在のスレッドを一時停止して、ブロック方式でスレッドの終了を待機し、スレッドが終了した場合はすぐに戻ります。0=成功

  4. pthread_cancel():終了信号をスレッドスレッドに送信し、成功した場合は0を返しますが、成功したからといってスレッドが終了するわけではありません。

  5. pthread_testcancel():キャンセルポイントが含まれていないが、キャンセルポイントが含まれていないコード実行スレッドでキャンセル要求に応答するために、キャンセルポイントが必要なキャンセルポイントを作成します。

  6. pthread_setcancelstate():このスレッドの応答をキャンセルスレッドに設定します

  7. pthread_setcanceltype():キャンセル状態を設定して、次のキャンセルポイントまで実行を継続し、終了するか、キャンセルアクションをすぐに実行します

  8. pthread_setcancel():キャンセルステータスを設定します

3.スレッド相互排除および同期メカニズム
基本的な相互排除および同期操作方法:

  1. pthread_mutex_init():ミューテックスロックの初期化

  2. pthread_mutex_lock():ミューテックスをロックします。ロックされているミューテックスをロックしようとすると、使用可能になるまでブロックされます。

  3. pthread_mutex_trylock():ノンブロッキングロックミューテックス

  4. pthread_mutex_unlock():ミューテックスロックを解除します

  5. pthread_mutex_destory():ミューテックスロック破壊関数

4つのマルチスレッドプラクティス

  1. 基本的なスレッドと確立および操作
    次のコードは、最も基本的な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の場合、直接戻ります。

  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)
(より無料のC / C ++、Linux、Nginx、ZeroMQ、MySQL、Redis、fastdfs、MongoDB、ZK、ストリーミングメディア、CDN、P2P、K8S、Docker、TCP / IP、coroutine、DPDKなどの高度な知識ポイント高度な乾物学習教材とグループ960994558)

おすすめ

転載: blog.csdn.net/weixin_52622200/article/details/110451922
おすすめ