Thread系列之AutoResetEvent

本文通过一个具体的示例详细介绍了AutoResetEvent同步对象的使用方法。AutoResetEvent用于控制线程间的同步,确保某些操作按顺序执行。文章展示了如何在.NET环境中使用AutoResetEvent来协调多个并行计算任务。

AutoResetEvent也是一个同步对象,它用于对资源的独占访问。

当AutoResetEvent处于终止状态时,如果存在等待的线程,则在该线程执行后,AutoResetEvent变量将自动变为非终止状态。

 

代码示例:

 

 

代码
class Program
{
staticvoid Main(string[] args)
{
Caclultae calc
=new Caclultae();
Console.WriteLine(
"Result={0}",calc.result(234).ToString());

Console.Read();
}
}
class Caclultae
{
double baseNum,firNum,secNum,thdNum;
AutoResetEvent[] autoEvents;
ManualResetEvent manualEvent;
Random Generator;
public Caclultae()
{
autoEvents
=new AutoResetEvent[]
{
new AutoResetEvent(false),
new AutoResetEvent(false),
new AutoResetEvent(false)
};
manualEvent
=new ManualResetEvent(false);
}
void CalBase(object stateInfo)
{
baseNum
= Generator.NextDouble();
Console.WriteLine(
"BaseNum is Ok");
manualEvent.Set();
}
void CalFirst(object stateInfo)
{
double preCalc = Generator.NextDouble();

manualEvent.WaitOne();
Console.WriteLine(
"FirstNum begins to Calculate");
firNum
= preCalc * baseNum * Generator.NextDouble();

autoEvents[
0].Set();
Console.WriteLine(
"FirstNum Calculates successfully");
}
void CalSec(object stateInfo)
{
double preCalc = Generator.NextDouble();
manualEvent.WaitOne();
Console.WriteLine(
"SecNum begins to Calculate");
secNum
= preCalc * baseNum * Generator.NextDouble();
autoEvents[
1].Set();
Console.WriteLine(
"SecNum Calculates successfully");
}
void CalThird(object stateInfo)
{
double preCalc = Generator.NextDouble();
manualEvent.WaitOne();
Console.WriteLine(
"ThrdNum begins to Calculate");
thdNum
= preCalc * baseNum * Generator.NextDouble();
autoEvents[
2].Set();
Console.WriteLine(
"ThrdNum Calculates successfully");
}
publicdouble result(int seed)
{
Generator
=new Random(seed);
ThreadPool.QueueUserWorkItem(
new WaitCallback(CalBase));
ThreadPool.QueueUserWorkItem(
new WaitCallback(CalFirst));
ThreadPool.QueueUserWorkItem(
new WaitCallback(CalSec));
ThreadPool.QueueUserWorkItem(
new WaitCallback(CalThird));
WaitHandle.WaitAll(autoEvents);
manualEvent.Reset();
return firNum + secNum + thdNum;
}

}

 

 

代码中,我们关注AutoResetEvent同步对象。从代码中我们可以看到 CalFirst、CalSec、CalThird方法中 都有一句AutoEvents[].Set()代码,这句代码就是通知等待该信号的线程,我已经完成我的任务,你可以获得该信号了,也就是说你执行你自己 任务的把握又大了一些。

在result方法中,我们可以看到WaitHanle.WatiAll()代码,这句代码说明result方法呢,在等待所有的信号变量都变成终止状态,这样他就可以执行自己的代码了。

 

执行结果:

 

可以看到结果,result是在其他三个方法执行完之后才执行的。

转载于:https://www.cnblogs.com/xyqCreator/archive/2013/01/10/2854450.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值