用单线程的思维去写多线程,真是头痛呀
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,线程已被阻止 |
本文深入探讨了C#中多线程编程的同步问题,特别是使用辅助线程配合ThreadState枚举进行多线程状态监控以实现有效同步的方法。通过实例分析了lock、monitor、AutoResetEvent等同步机制的应用局限性,并最终揭示了利用ThreadState辅助线程查询多线程状态以完成同步的策略。

1168

被折叠的 条评论
为什么被折叠?



