读写锁的例子

程序说明:

         线程a,b分别从字符串eg中取出一个字符,赋值给字符指针pro.

         线程c,d分别从pro中取出字符,并打印

         程序用读写锁对线程abcd进行同步

用到的读写锁函数有:

#include<pthread.h>

 int pthread_rwlock_rdlock(pthread_rwlock_t *rwptr);
 int pthread_rwlock_wrlock(pthread_rwlock_t *rwptr);
 int pthread_rwlock_unlock(pthread_rwlock_t *rwptr);
#include <stdio.h>
#include <stdlib.h>
#include<pthread.h>
#include<string.h>
#define RDNUM 2
#define WRNUM 2

char eg[]="I'm a test!";
char *pro;
struct {
    int i;
    pthread_rwlock_t mutex;
}shared={
        0,PTHREAD_RWLOCK_INITIALIZER
};
void pthw(){
    int len=strlen(eg)+1;
    int write_num=0;
    for(;;){
        pthread_rwlock_wrlock(&shared.mutex);
        if(shared.i>=len)
        {
            pthread_rwlock_unlock(&shared.mutex);
            break;
        }
        pro[shared.i]=eg[shared.i];
        shared.i++;
        write_num++;
        pthread_rwlock_unlock(&shared.mutex);
        sleep(1);
    }
    printf("进程%lu写了%d个字符
",pthread_self(),write_num);

}
void pthr(){
    int len=strlen(eg)+1;
    int read_num=0;
    for(;;){
        pthread_rwlock_rdlock(&shared.mutex);
        if(shared.i>=len&&read_num==len)
        {
            pthread_rwlock_unlock(&shared.mutex);
            break;
        }
        while(read_num<shared.i){
            printf("进程%lu读了%c
",pthread_self(),pro[read_num]);
            read_num++;
        }
        pthread_rwlock_unlock(&shared.mutex);
    }
}
int main(void) {
     pthread_t rd[RDNUM],wr[WRNUM];
     int i;
     int len=strlen(eg)+1;
     pro=(char*)malloc(sizeof(char)*(len+1));
     for(i=0;i<WRNUM;i++){
         pthread_create(&wr[i],NULL,pthw,NULL);
     }
     for(i=0;i<RDNUM;i++){
              pthread_create(&rd[i],NULL,pthr,NULL);
          }
     for(i=0;i<WRNUM;i++){
              pthread_join(wr[i],NULL);
          }
     for(i=0;i<RDNUM;i++){
              pthread_join(rd[i],NULL);
          }
     free(pro);
    puts("!!!Hello World!!!"); 
    return EXIT_SUCCESS;
}

运行结果:

     

原文地址:https://www.cnblogs.com/sklww/p/3496745.html