操作系统--同步与互斥问题

1. 生产者-消费者问题

    #define N 100                 //有界缓冲区大小

   typedef int semaphore  //定义信号量

  semaphore mutex = 1;  //临界区互斥信号量

  semaphore empty = N; //空闲缓冲区

  semaphore full = 0;       //缓冲区初始化为空

  void producer(void)

{

    int item;                        //局部变量

    wile(1){

       item = produce_item();  //生产数据

      P(empty);                   //获取空数据槽

      P(mutex);                  //获取进入临界区的信号量

      insert_item(item);   // 将数据放入缓冲池

     V(mutex);                   //释放互斥量

     V(full);                        //数据量加一

   }

}


void consumer(void)

{

    int item;                      //局部变量

    while(1){

        P(full);                    //获取数据槽

        P(mutex);              //获取进入临界区的信号量

        item = remove_item();  //将数据从缓冲池读出

       V(mutex);              //释放互斥量

       V(empty);              //数据量减一,即空槽加一

      consume_item(item); //消费数据

    }

}



读者-写者问题

typedef int semaphore;    //定义信号量

semaphore rmutex = 1;   //读者计数器的互斥量

semaphore wmutex = 1; //写一写,读一写互斥量

int readcount = 0;             //读者计数器

void reader(void)              //读者进程

{

    while(1){

        P(rmutex);                //取得读者计数器的互斥量

        readcount = readcount+1;  //进来一个读者。读者数量加一

        if(readcount == 1)  P(wnutex);  //如果是第一个读者,取得读一写互斥量

        V(rmutex);              //释放读者计数器的互斥量

        read_data_base();  //读数据

       P(rmutex);             //读者读完数据要离开,先取得读者计数器的互斥量

       readcount = readcount - 1;   //读者数量减一

       if(readcount == 0) V(wmutex);  //如果是最后一个离开的读者,释放读一写互斥量

      V(rmutex);              //释放读者计数器的互斥量

      use_dataread();

     }

}


void writer(void)           //写者进程

{

   while(1){

     think_up_Data();   //写者产生数据

     P(wmutex);             //获得写一写,读一写操作互斥量

     write_data_base();  //写入数据库

     V(wmutex);                //释放写一写,读一写操作互斥量

  }

}

你可能感兴趣的:(扩展知识信息)