Csharp/C Sharp by API/System.Runtime.CompilerServices/MethodImplOptions

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

MethodImplOptions.Synchronized

<source lang="csharp"> /* Revised from code in "Computing with C# and the .NET Framework"

  1. Paperback: 753 pages
  2. Publisher: Jones and Bartlett Publishers, Inc.; Bk&CD-Rom edition (February 2003)
  3. Language: English
  4. ISBN: 0763723398
  5. Product Dimensions: 8.9 x 7.7 x 1.1 inches
  • /

using System; using System.Runtime.rupilerServices; using System.Threading;

 class Buffer {
   public const int size = 3;
   int[] buffer = new int [size];             
   int putpos=0;
   int getpos=0;
   int number=0;
   [MethodImpl(MethodImplOptions.Synchronized)]
   public void Put(int value) {
     if (number == size) {
       Console.WriteLine("Cannot put -- Buffer full");
       Monitor.Wait(this);
     }
     number++;
     buffer[putpos] = value;
     Console.WriteLine("Put "+value);
     putpos = (putpos + 1) % size;
     if (number == 1) Monitor.Pulse(this);         
   }
   [MethodImpl(MethodImplOptions.Synchronized)]
   public int Get() {
     if (number == 0) {
        Console.WriteLine("Buffer empty");
        Monitor.Wait(this);
     }
     number--;
     int n = buffer[getpos];
     Console.WriteLine("Get "+n);
     getpos = (getpos + 1) % size;
     if (number == size - 1) Monitor.Pulse(this);    
     return n;
   }
 }
 class Producer {
    Buffer buf;
    public Producer(Buffer b) { 
       buf = b;
       Thread thread = new Thread(new ThreadStart(Run));
       thread.Start();  
    }      
    public void Run() {
      for(; true; ) {
            buf.Put(0);
      }
    }
 }
 class Consumer {
    Buffer buf;
    public Consumer(Buffer b) { 
      buf = b;
      Thread thread = new Thread(new ThreadStart(Run));
      thread.Start();  
    }
    public void Run() {
      for (; true;) {
          buf.Get();
      }
    }
 }

public class PutGet {

 public static void Main(String[] args) {
   Buffer b = new Buffer();
   Producer p = new Producer(b);
   Consumer c = new Consumer(b);
 }

}


 </source>