多线程的同步原来应该这么用
用单线程的思维去写多线程,真是头痛呀
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 |
由于调用Wait、Sleep或Join,线程已被阻止 |
摘自 rztyfx的专栏
补充:软件开发 , C# ,