Mega Code Archive

 
Categories / C# / Thread
 

Use MethodImplAttribute to synchronize a method

/* C#: The Complete Reference  by Herbert Schildt  Publisher: Osborne/McGraw-Hill (March 8, 2002) ISBN: 0072134852 */ // Use MethodImplAttribute to synchronize a method.    using System;  using System.Threading;  using System.Runtime.CompilerServices;    class TickTock {      /* The following attribute synchronizes the entire       tick() method. */    [MethodImplAttribute(MethodImplOptions.Synchronized)]    public void tick(bool running) {      if(!running) { // stop the clock        Monitor.Pulse(this); // notify any waiting threads        return;      }        Console.Write("Tick ");      Monitor.Pulse(this); // let tock() run          Monitor.Wait(this); // wait for tock() to complete    }        /* The following attribute synchronizes the entire       tock() method. */    [MethodImplAttribute(MethodImplOptions.Synchronized)]    public void tock(bool running) {      if(!running) { // stop the clock        Monitor.Pulse(this); // notify any waiting threads        return;      }        Console.WriteLine("Tock");      Monitor.Pulse(this); // let tick() run        Monitor.Wait(this); // wait for tick to complete    }    }     class MyThread {    public Thread thrd;    TickTock ttOb;      // Construct a new thread.    public MyThread(string name, TickTock tt) {      thrd = new Thread(new ThreadStart(this.run));      ttOb = tt;      thrd.Name = name;      thrd.Start();     }      // Begin execution of new thread.    void run() {      if(thrd.Name == "Tick") {        for(int i=0; i<5; i++) ttOb.tick(true);        ttOb.tick(false);      }      else {        for(int i=0; i<5; i++) ttOb.tock(true);        ttOb.tock(false);      }    }  }    public class TickingClock1 {    public static void Main() {      TickTock tt = new TickTock();      MyThread mt1 = new MyThread("Tick", tt);      MyThread mt2 = new MyThread("Tock", tt);        mt1.thrd.Join();      mt2.thrd.Join();      Console.WriteLine("Clock Stopped");    }  }