using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace _313_spring_08_threading_join
{
    class Sum
    {
        public double value = 0.0;
    }

    class Program
    {
        static int ID = 0;
        static Random r = new Random();

        static Sum SUM = new Sum();

        static void Main(string[] args)
        {
            int COUNT = 4;
            List workers = new List();

            for (int i = 0; i < COUNT; i++)
            {
                Thread t = new Thread(new ThreadStart(DoWork));
                if (i < 2)
                    t.Priority = ThreadPriority.Lowest;
                else
                    t.Priority = ThreadPriority.Highest;
                workers.Add(t);
                t.Start();
            }

            foreach (Thread t in workers)
                t.Join();

            Console.WriteLine("Main has as total of {0:0.0}", SUM.value);
        }

        static void DoWork()
        {
            int id = ID;
            ID++;

            double local_sum = 0;
            
            Console.WriteLine("Thread " + id + " running");
            
            for (long i = 0; i < 10000000; i++)
            {
                local_sum += Convert.ToDouble(r.Next(10)) + 
                    Convert.ToDouble(r.Next(10)) * Convert.ToDouble(0.1);
            }

            Console.WriteLine("Worker {0} calculates {1:0.0}", id, local_sum);

            Monitor.Enter(SUM);
            double current_sum = SUM.value;
            current_sum += local_sum;
            SUM.value = current_sum;
            Monitor.Exit(SUM);
        }
    }
}