スレッド セーフ --- ミューテックス ロックと読み取り/書き込みロック

ミューテックスロック

    セマフォの値が最大 1の場合 、実際には、常に最大 1 行の共有リソースと同等になります。
プロセスがアクセスしている場合、このロジックは「相互排他」と呼ばれます。現時点では、より便利で意味的に正確なツールがあり、
このロジックに基づくと、これはミューテックス ロックです。
      「ロック」は非常に鮮やかな言い方です。部屋に 1 人しか入れないのと同じように、部屋に入る人は誰でもその部屋に鍵をかけます。
ドアはロックされており、入った人が再びロックを開けてロック リソースが解放されるまで、他の人は入ることができません。
終わり。
    ミューテックス ロックの操作は、初期化、ロック、ロック解除、および破棄にすぎません。以下のコードは、次の 2 つのスレッドを示しています。
ミューテックス ロックを使用して標準出力への相互排他的アクセスを提供する方法。
#include<stdio.h>
#include <semaphore.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>

char *mem_map=NULL;

pthread_mutex_t lock;

void *function(void *arg)
{
    char *msg=(char *)arg; 
    printf("线程号:%ld 收到参数:%s\n",pthread_self(),msg);
   while (1)
  {
       printf("\nfunction等待锁 \n");
    pthread_mutex_lock(&lock);
    printf("function获取资源 已上锁\n ");
     printf("msg:%s\n",mem_map);
      sleep(1);
    pthread_mutex_unlock(&lock);
   
  }
}
int main(int argc, char const *argv[])
{
    pthread_mutex_init(&lock,NULL);
   mem_map=calloc(1,32);
   pthread_t thread;
   pthread_create(&thread, NULL,function, "Hello Gz123");   
  while (1)
 {
    printf("main 等待资源....\n ");
    pthread_mutex_lock(&lock);
    printf("main获取资源 以上锁 \n");
     printf("main获取成功发送数据:");
   fgets(mem_map,32,stdin);
    sleep(1);
   printf("main 释放资源\n");
   pthread_mutex_unlock(&lock);
 }
   pthread_join(thread,NULL);
    return 0;
}

読み書きロック

       ミューテックス ロックの非効率性は、共有リソースへのアクセス方法に詳細な区別がなく、いつでも万能のアクセスが利用できることです。
共有リソースにアクセスできるスレッドは 1 つだけですが、実際には、読み取り操作は同時に実行でき、相互に必要となるのは書き込み操作のみです。
除外。読み取りロック (繰り返し追加可能) または書き込みロック (のみ追加可能) を追加できる場合
一度に 1 つずつ許可すると、効率が大幅に向上します (特に読み取り操作が多数ある場合)。
      リードライトロックの動作はミューテックスロックとほぼ同じですが、ロック時にリードを追加するかライトを追加するかを選択できる点が異なります。
ロック、次のコードはその使用方法を示しています。
#include<stdio.h>
#include <semaphore.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
//定义线程间共享资源

//定义一个指针作用与线程之间的共享内存
char *mem_map=NULL;

pthread_rwlock_t rwlock;

void *function(void *arg)
{
    char *msg=(char *)arg;
   
   while (1)
{
    pthread_rwlock_rdlock(&rwlock);
     printf("线程%s号:%s \n",msg,mem_map);
    pthread_rwlock_unlock(&rwlock);
    sleep(2);
   
}
}
int main(int argc, char const *argv[])
{
  
    pthread_rwlock_init(&rwlock,NULL);

    mem_map=calloc(1,32);

      pthread_t thread1;
      pthread_t thread2;
      pthread_t thread3;
      pthread_t thread4;
     pthread_create(&thread1, NULL,function, "1");   
     pthread_create(&thread2, NULL,function, "2");   
     pthread_create(&thread3, NULL,function, "3"); 
     pthread_create(&thread4, NULL,function, "4");   
while (1)
{
    printf("main 等待上写锁....\n ");
    pthread_rwlock_wrlock(&rwlock);
    printf("main获取资源成功上写锁 \n");
    fgets(mem_map,128,stdin);
    pthread_rwlock_unlock(&rwlock);
    printf("解除写锁....\n");
    sleep(5);
}
   pthread_join(thread1,NULL);
   pthread_join(thread2,NULL);
   pthread_join(thread3,NULL);
   pthread_join(thread4,NULL);
    return 0;
}

おすすめ

転載: blog.csdn.net/m0_52467164/article/details/127563070