Csharp/CSharp Tutorial/Thread/synchronized

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

Shared Resource

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
   class Tester{
      static int counter = 0;
      static void Main()
      {
         Thread t1 = new Thread( new ThreadStart( Incrementer ) );
         t1.IsBackground = true;
         t1.Name = "ThreadOne";
         t1.Start();
         Console.WriteLine( "Started thread {0}",t1.Name );
         Thread t2 = new Thread( new ThreadStart( Incrementer ) );
         t2.IsBackground = true;
         t2.Name = "ThreadTwo";
         t2.Start();
         Console.WriteLine( "Started thread {0}",t2.Name );
         t1.Join();
         t2.Join();
      }
      public static void Incrementer(){
         try{
            while ( counter < 1000 )
            {
               int temp = counter;
               temp++; 
               Thread.Sleep( 1 );
               counter = temp;
               Console.WriteLine("Thread {0}. Incrementer: {1}",Thread.CurrentThread.Name,counter );
            }
         }catch ( ThreadInterruptedException ){
            Console.WriteLine("Thread {0} interrupted! Cleaning up...",Thread.CurrentThread.Name );
         }
         finally
         {
            Console.WriteLine("Thread {0} Exiting. ",Thread.CurrentThread.Name );
         }
      }
   }

Sync Delegate

using System.Threading;
using System;
  public delegate int BinaryOp(int x, int y);
  class Program
  {
    static void Main(string[] args)
    {
      Console.WriteLine("Main() invoked on thread {0}.",Thread.CurrentThread.ManagedThreadId);
      BinaryOp b = new BinaryOp(Add);
      int answer = b(10, 10);
      Console.WriteLine("Doing more work in Main()!");
      Console.WriteLine("10 + 10 is {0}.", answer);
      Console.ReadLine();
    }
    static int Add(int x, int y)
    {
      Console.WriteLine("Add() invoked on thread {0}.",Thread.CurrentThread.ManagedThreadId);
      Thread.Sleep(5000);
      return x + y;
    }
  }

Using synchronized methods

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime;
using System.Runtime.rupilerServices;
using System.Security;
using System.Text;
using System.Threading;
public class MainClass
{
    private static int count = 0;
    private static object myMutex = new object();
    
    [MethodImpl(MethodImplOptions.Synchronized)]
    public static void Main()
    {
         count++;
    }
}