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

    运行结果:

         

  • 相关阅读:
    RTB业务知识2-Open-RTB全景
    常见的选择&lt;数据源协议,委托协议&gt;(IOS发展)
    PHP高级编程SPL
    matlab 基础知识class &lt; superclass_name
    Codeforces Round #FF (Div. 2)
    HDU 5063 Operation the Sequence
    新版本MenuDemo——使用Duilib模拟Windows本机菜单
    Codeforces 458A Golden System
    Arcgis for Javascript实现图
    [Angular2Fire] Firebase auth (Google, Github)
  • 原文地址:https://www.cnblogs.com/sklww/p/3496745.html
Copyright © 2011-2022 走看看