using System;
using System.Threading;
namespace ConsoleApplication1
{
// Another way to use lock to synchronize access to an object(另一种方法是使用锁来同步访问对象)
class SumArray
{
int sum;
public int sumIt(int[] nums)
{
sum = 0; // reset sum
for (int i = 0; i < nums.Length; i++)
{
sum += nums[i];
Console.WriteLine("Running total for" + Thread.CurrentThread.Name +
"is " + sum);
Thread.Sleep(10); // allow task-switch
}
return sum;
}
}
class MyThread
{
public Thread thrd;
int[] a;
int answer;
/* Create one SumArray onject for all
instances of MyThread. */
static SumArray sa = new SumArray();
// construct a new thread.
public MyThread(string name, int[] nums)
{
a = nums;
thrd = new Thread(this.run);
thrd.Name = name;
thrd.Start(); // start the thread
}
// Begin execution of new thread
void run()
{
Console.WriteLine(thrd.Name + "starting.");
// Lock calls to sumIt()
lock(sa) answer = sa.sumIt(a);
Console.WriteLine("Sum for " + thrd.Name + " is " + answer);
Console.WriteLine(thrd.Name + "terminating.");
}
}
class sync
{
public static void Main()
{
int[] a = { 1, 2, 3, 4, 5 };
MyThread mt1 = new MyThread("Child #1", a);
MyThread mt2 = new MyThread("Child #2", a);
mt1.thrd.Join();
mt2.thrd.Join();
Console.Read();
}
}
}