zoukankan      html  css  js  c++  java
  • [Operating System] {ud923} PSet1 (unfinished)

    /* Requirements:
    Priority Readers and Writers
    Write a multi-threaded C program that gives readers priority over writers concerning a shared (global) variable. Essentially, if any readers are waiting, then they have priority over writer threads -- writers can only write when there are no readers. This program should adhere to the following constraints:
    
    Multiple readers/writers must be supported (5 of each is fine)
    Readers must read the shared variable X number of times
    Writers must write the shared variable X number of times
    Readers must print:
    The value read
    The number of readers present when value is read
    Writers must print:
    The written value
    The number of readers present were when value is written (should be 0)
    Before a reader/writer attempts to access the shared variable it should wait some random amount of time
    Note: This will help ensure that reads and writes do not occur all at once
    Use pthreads, mutexes, and condition variables to synchronize access to the shared variable
    */
    #include <pthread.h>
    #include <iostream>
    #include <vector>
    #include <random>
    #include <unistd.h>
    
    using std::cout;
    using std::endl;
    using std::vector;
    
    #define print(a) cout<<a<<endl;
    #define NUM_ITERATION 5
    
    int data = 11;
    pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
    pthread_cond_t c_reader = PTHREAD_COND_INITIALIZER;
    pthread_cond_t c_writer = PTHREAD_COND_INITIALIZER;
    int num_reader = 0;
    int num_writer = 0;
    
    std::random_device rand_device;
    
    void* Reader(void* param);
    void* Writer(void* param);
    
    int main(int argc, char* argv[]){
    
        pthread_t Readers[5];
        pthread_t Writers[5];
    
        long i;
        for(i=0; i<5; ++i){
            pthread_create(&Readers[i],NULL,Reader,(void*)i);
            pthread_create(&Writers[i],NULL,Writer,(void*)i);
        }
    
        for(i=0; i<5; ++i){
            pthread_join(Readers[i],NULL);
            pthread_join(Writers[i],NULL);
        }
    
        return 0;
    }
    void* Reader(void* param){
        long name = (long) param;
        for (int i=0; i<NUM_ITERATION; ++i){
            usleep(300+rand_device()%300);
            pthread_mutex_lock(&m);
                // while(num_writer>0){
                //     pthread_cond_wait(&c_writer,&m);
                // }
                ++num_reader;
                print("reader #"<<name<<" gets:"<<data<<", along with other "<<(num_reader-1)<<" readers.");
            pthread_mutex_unlock(&m);
            --num_reader;
            if (num_reader == 0){
                pthread_cond_signal(&c_reader);
            }
        }
        pthread_exit(0);
    }
    void* Writer(void* param){
        long name = (long) param;
        for (int i=0; i<NUM_ITERATION; ++i){
            usleep(300+rand_device()%300);
            pthread_mutex_lock(&m);
                while(num_reader>0){
                    pthread_cond_wait(&c_reader,&m);
                }
                ++num_writer;
                data = rand_device()%90 + 10;
                print("writer #"<<name<<" changes data to "<<data<<", along with "<<num_reader<<" readers.");
            pthread_mutex_unlock(&m);
            --num_writer;
            // if(num_writer == 0){
            //     pthread_cond_signal(&c_writer);
            // }
        }
        pthread_exit(0);
    }

  • 相关阅读:
    分布式协调服务 ( 服务治理 ).
    【Java常用类之enumm枚举类 20】
    【Java常用类之date类 19】
    【Java常用类之String类18】
    【Java数组算法17】
    【Java数组-二维数组16】
    【Java数组-一维数组15】
    【Java异常 14】
    【Java的package/import&访问权限&修饰符&Object常用方法 13】
    《Rubu基础教程第五版》第十七章笔记 IO类
  • 原文地址:https://www.cnblogs.com/ecoflex/p/10898707.html
Copyright © 2011-2022 走看看