Monitor线程同步

   最近在园子里看到有关monitor实现线程同步的文章,正好最近的项目中要用到并发控制,所以就抽时间学习了一下monitor,之前都是不怎么写博客的,呵呵感觉花了时间去学习它,还是记下来比较好。。monitor我理解为是一个监视器,用来监视临界区域的信号量。学过操作系统的童鞋都应该知道这个概念哈~因为要通过信号量,所以要定义一个信号量,这里我们通常定义一个object类型的变量,注意这个变量一定要是一个公共的,并且是全局的,千万不能定义在临界区内~~~

   

View Code
class MonitorTest
{
MyServer.MyServerClient wcf = new MyServer.MyServerClient();
IMyServer ichan = null;
ChannelFactory<IMyServer> cha = new ChannelFactory<IMyServer>("BasicHttpBinding_IMyServer");
object monitor = new object();
public static int iCount = 0;
public MonitorTest()
{
cha.Open();
ichan = cha.CreateChannel();
wcf.CalculateCompleted += new EventHandler<MyServer.CalculateCompletedEventArgs>(wcf_CalculateCompleted);
}

void wcf_CalculateCompleted(object sender, MyServer.CalculateCompletedEventArgs e)
{
Console.WriteLine("我是线程{0} "+"iCount的值为{1}",Thread.CurrentThread.Name,e.Result.ToString());
}

public void Test()
{
Thread t1 = new Thread(Test1);
t1.Name = "t1";

Thread t2 = new Thread(Test2);
t2.Name = "t2";

t1.Start();
t2.Start();

}
public void Test1()
{

for (int i = 0; i < 10; i++)
{
iCount++;
Console.WriteLine("我是线程{0} " + "iCount的值为{1}", Thread.CurrentThread.Name, iCount);
}
}
public void Test2()
{
for (int i = 0; i < 10; i++)
{
iCount--;
Console.WriteLine("我是线程{0} " + "iCount的值为{1}", Thread.CurrentThread.Name, iCount);
}
}
}

  本来想通过控制台项目添加wcf引用的,可是不知道为什么在调用服务了,没有任何反应,用fiddler工具也没有检测到任何的信息,所以,无奈之下,只好调用本地的方法,以后再研究研究。上面是没有加锁控制的,可以看到结果很混乱,谁抢到了谁就用。。显然不行。

   下面是加锁之后的效果:

    

View Code
class MonitorTest
{
MyServer.MyServerClient wcf = new MyServer.MyServerClient();
IMyServer ichan = null;
ChannelFactory<IMyServer> cha = new ChannelFactory<IMyServer>("BasicHttpBinding_IMyServer");
object monitor = new object();
public static int iCount = 0;
public MonitorTest()
{
cha.Open();
ichan = cha.CreateChannel();
wcf.CalculateCompleted += new EventHandler<MyServer.CalculateCompletedEventArgs>(wcf_CalculateCompleted);
}

void wcf_CalculateCompleted(object sender, MyServer.CalculateCompletedEventArgs e)
{
Console.WriteLine("我是线程{0} "+"iCount的值为{1}",Thread.CurrentThread.Name,e.Result.ToString());
}

public void Test()
{
Thread t1 = new Thread(Test1);
t1.Name = "t1";

Thread t2 = new Thread(Test2);
t2.Name = "t2";

t1.Start();
t2.Start();

}
public void Test1()
{

lock (monitor)
{
Monitor.Pulse(monitor);
for (int i = 0; i < 10; i++)
{
iCount++;
Console.WriteLine("我是线程{0} " + "iCount的值为{1}", Thread.CurrentThread.Name, iCount);
}
Monitor.Wait(monitor);

}
}
public void Test2()
{
lock (monitor)
{
Monitor.Pulse(monitor);
for (int i = 0; i < 10; i++)
{
iCount--;
Console.WriteLine("我是线程{0} " + "iCount的值为{1}", Thread.CurrentThread.Name, iCount);
}
Monitor.Wait(monitor);
}
}
}

posted on 2012-03-20 21:33  夏天爱上雨  阅读(402)  评论(0编辑  收藏  举报

导航