多线程的同步原来应该这么用

本文深入探讨了C#中多线程编程的同步问题,特别是使用辅助线程配合ThreadState枚举进行多线程状态监控以实现有效同步的方法。通过实例分析了lock、monitor、AutoResetEvent等同步机制的应用局限性,并最终揭示了利用ThreadState辅助线程查询多线程状态以完成同步的策略。

 用单线程的思维去写多线程,真是头痛呀

C#中多线程很方便,但是遇到复杂点的任务,同步成了大问题,google到一大堆的方法:

lock

monitor

信号量AutoResetEvent和ManualResetEvent

mutex

都试过了,可是却总是同步不了,总会有线程在竞争,单线测试没任何问题,多线是的问题总是莫名其妙

VS的调试器在多线程下调试几乎能让人崩溃

后来冷静下来,终于想明白是怎么回事了:

要转变思路,多线程中的代码始终处于竞争状态,也就是CPU在不断轮询,其实CPU始终如此,只不过多线更明显而已

想要让代码按顺序执行,可以利用一个辅助线程,不断查询多线程的状态

在需要的时候可以利用让ManualResetEvent线程waitone(),辅助线程查询到所有线程状态均为

WaitSleepJoin时,就可以去执行你需要的代码,这样就能完成同步

以下为ThreadState定义的枚举常数

成员名称

   

Aborted

线程处于Stopped状态中

AbortRequested

已对线程调用了Thread.Abort方法,但线程尚未收到试图终止它的挂起的System.Threading. ThreadAbortException

Background

线程正作为后台线程执行(相对于前台线程而言)。此状态可以通过设置Thread.IsBackground属性来控制

Running

线程已启动,它未被阻塞,并且没有挂起的ThreadAbortException

Stopped

线程已停止

StopRequested

正在请求线程停止。这仅用于内部

Suspended

线程已挂起

SuspendRequested

正在请求线程挂起

Unstarted

尚未对线程调用Thread.Start方法

WaitSleepJoin

由于调用WaitSleepJoin,线程已被阻止

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值