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);
}
}
}