AutoResetEvent 和ManualResetEvent

本文详细解析了.Net中AutoResetEvent与ManualResetEvent的区别及用法。通过构造函数确定初始状态,两种类型通过Set与Reset方法改变信号状态,WaitOne使线程等待信号。AutoResetEvent每次仅唤醒一个线程并自动重置信号;而ManualResetEvent可唤醒多个线程,需手动重置。

在.Net多线程编程中,AutoResetEvent和ManualResetEvent这两个类经 常用到, 他们的用法很类似,但也有区别。
Set方法将信号置为发送状态,Reset方法将信号置为不发送状态,WaitOne等待信号的发送。

可以通过构造函数的参数值来决定其初始状态,若为true则非阻塞状态,为false为阻塞状态。

如果某个线程调用WaitOne方法,则当信号处于发送状态时,该线程会得到信号, 继续向下执行。


其区别就在调用后,AutoResetEvent.WaitOne()每次只允许一个线程进入,当某个线程得到信号后,AutoResetEvent会自 动又将信号置为不发送状态,则其他调用WaitOne的线程只有继续等待.也就是说,AutoResetEvent一次只唤醒一个线程;

而ManualResetEvent则可以唤醒多个线程,因为当某个线程调用了 ManualResetEvent.Set()方法后,其他调用WaitOne的线程获得信号得以继续执行,而ManualResetEvent不会自动 将信号置为不发送。

也就是说,除非手工调用了ManualResetEvent.Reset()方法,则 ManualResetEvent将一直保持有信号状态,ManualResetEvent也就可以同时唤醒多个线程继续执行。

 

 

一个简单的例子

//先声明两个同步对象

        ManualResetEvent mre = new ManualResetEvent(false);
        AutoResetEvent are = new AutoResetEvent(false);

 

//启动两个线程


            System.Threading.Thread t1 = new Thread(T1);
            t1.IsBackground = true;
            t1.Start();

            System.Threading.Thread t2 = new Thread(T2);
            t2.IsBackground = true;
            t2.Start();

//线程调用的方法

 public void T1()
        {
              mre.WaitOne();//注意这个地方
            Console.WriteLine("t1......");
        }

        public void T2()
        {
            mre.WaitOne();
            Console.WriteLine("t2......");
        }

然后再设置一个按钮方法用来发送信号,注意红字的地方

第一我们使用ManualResetEvent对象来调用waitOne。然后执行按钮方法 mre.set();这个时候会输出结果

t1......

t2......

//表明ManualResetEvent发一次信息就可以让所有等待的线程都结束等待,开始运行

第二种情况。我们使用AutoResetEvent来调用waitOne。然后执行按钮方法are.set();这个时候会输出结果

t1......(//或者是t2......,谁先执行并没有一定的关系)

会发现点击一次按钮的are.set()只会结束一个线程的等待,另外一个线程仍然处于等待状态,

只有点击两次按钮执行are.set()方法才能让两个等待线程都结束等待

本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。

转载于:https://www.cnblogs.com/zjypp/archive/2010/01/26/2319378.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化并行计算等改进策略。; 适合人群:具备一定Python编程基础优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值