基于C#实现的多生产者多消费者同步问题实例

2021-04-25 21:34

阅读:546

标签:链接   .net   har   tran   com   width   strong   png   and   

本文实例讲述了基于C#实现的多生产者多消费者同步问题,分享给大家供大家参考之用。具体代码如下:

// 多个生产者和多个消费者,能生产n个产品的情况
using System;
using System.Threading;
public class HoldIntegerSynchronized{
 private int[] buffer; //缓冲区
 private int occupiedBufferCount = 0;
 private int readPosition = 0 , writePosition = 0;
 //下一个读到的位置和写到的位置
 public HoldIntegerSynchronized(int capacity){
 buffer = new int[capacity];
 }
 public int BufferSize{
 get{
  return buffer.Length;
 }
 }
 public int Buffer{
 get{
  int bufferCopy;
  // 加锁
  lock(this){
  while(occupiedBufferCount == 0){ //多个消费者,所以此处改用while
   Console.WriteLine(Thread.CurrentThread.Name + " tries to read. ");
   DisplayState("Buffer Empty. " + Thread.CurrentThread.Name + " waits.");
   Monitor.Wait(this);
   // 为临界区之外等待的生产者放行,让他来"生产"
   // 一直到生产者生产结束,调用了Monitor.PauseAll()
   // 才能继续执行下去,此时,消费者自动重新获得this的锁
  }
  --occupiedBufferCount;
  bufferCopy = buffer[readPosition];
  readPosition = (readPosition + 1) % buffer.Length;
  DisplayState(Thread.CurrentThread.Name + " reads " + bufferCopy);
  // 通知,让等待的 生产者线程 进入Started状态,如果生产者处于临界区之外,这句话执行完后他仍然在临界区之外
  Monitor.PulseAll(this);
  // 释放锁
  }//lock
  return bufferCopy;
 }
 set{
  // 加锁
  lock(this){
  while(occupiedBufferCount == buffer.Length){
   Console.WriteLine(Thread.CurrentThread.Name + " tries to write. ");
   DisplayState("Buffer Full. " + Thread.CurrentThread.Name + " waits.");
   Monitor.Wait(this);
   // 为临界区之外等待消费者放行,让他来"消费"
   // 一直到消费者调用了Monitor.Pause()
   // 才能继续执行下去,此时,生产者自动重新获得this的锁
  }
  buffer[writePosition] = value;
  ++occupiedBufferCount;
  writePosition = (writePosition + 1) % buffer.Length;
  DisplayState(Thread.CurrentThread.Name + " writes " + value);
  // 通知,让Wait状态的 消费者 进入Started状态,如果消费者处于临界区之外,这句话执行完后他仍然在临界区之外
  Monitor.PulseAll(this);
  // 释放锁
  }
 }
 }
 public void DisplayState(string operation){
 Console.Write("{0,-35}",operation);
 for(int i = 0; i 

希望本文所述对大家C#程序设计的学习有所帮助。

除声明外,跑步客文章均为原创,转载请以链接形式标明本文地址
  基于C#实现的多生产者多消费者同步问题实例

本文地址:  http://www.paobuke.com/develop/c-develop/pbk23531.html




相关内容

技术分享图片
C#验证码问题的快速解决方法
技术分享图片
C# 中DateTime 的使用技巧汇总
技术分享图片
C#使用ADO.Net部件来访问Access数据库的方法
技术分享图片
C#加密app.config中连接字符串的方法

技术分享图片
C#使用Matrix执行缩放的方法
技术分享图片
C#中委托的+=和-=深入研究
技术分享图片
C#简单的特殊输出实例
技术分享图片
C#事件处理和委托event delegate实例简述

基于C#实现的多生产者多消费者同步问题实例

标签:链接   .net   har   tran   com   width   strong   png   and   

原文地址:http://www.cnblogs.com/paobuke/p/7919847.html


评论


亲,登录后才可以留言!