zoukankan      html  css  js  c++  java
  • 读写锁的例子

    程序说明:

             线程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;
    }

    运行结果:

         

  • 相关阅读:
    linux一些配置
    tomcat启动后,页面无法访问
    利用jmeter实现多IP压测
    java操作数据库
    excle中表头分割单元格
    常用的最大流算法 Dinic 和 最小费用最大流SPFA写法
    [kuangbin]带你飞之'网络流'专题
    (留坑以后再看)一般图'最大匹配' 带花树 算法
    二分图'多重匹配'
    二分图'最大匹配' HK 算法
  • 原文地址:https://www.cnblogs.com/sklww/p/3496745.html
Copyright © 2011-2022 走看看