今天得空,就琢磨了一下那个叫 `resumethread` 的玩意儿。之前做个小工具,老是遇到需要让一个干活的线程先停一停,等我这边准备好了再让它继续跑的情况,就想着找找看有没有现成的法子。
咋开始的?
我就在想,这线程跑起来,总得有个开关?就像按个暂停键一样。随便搜了搜,好像Windows系统自己就带了这么个东西,叫 `SuspendThread` 和 `ResumeThread`。听名字挺直白的,一个暂停,一个恢复。
具体咋弄的?
那我就动手试试呗。开了我的老伙计(电脑),搞了个最简单的测试程序。大概思路就是:
- 先创建一个新线程,让它跑个死循环,里面不停地打印点东西,表示它在干活。
- 主线程这边,等个几秒钟,让那个新线程先跑一会儿。
- 然后,关键来了,调用那个 `SuspendThread`,把新线程给“冻住”。这时候,果然看到控制台不打印新东西了,说明线程确实停了。
- 再让主线程干点别的,或者就等个几秒钟,模拟处理其他事情。
- 调用 `ResumeThread`,把那个新线程“解冻”。立马就看到控制台又开始打印了,跟暂停前一样。
过程倒腾下来还算顺利,确实能实现暂停和恢复。但是,后来查了点资料,好多地方都说这个 `SuspendThread` 不太推荐用,说容易出问题,比如死锁啥的,特别是在线程停在不该停的地方的时候。想想也是,你猛地把人家按住,万一人家手里正拿着关键的东西(锁),其他等着要这东西的线程不就傻眼了?
然后我就想,那要是在别的系统,比如Linux上咋办?好像没听说有直接对应的 `ResumeThread`。查了下,那边一般是用别的方法,比如啥信号(signal)或者条件变量(condition variable)之类的东西来搞线程同步。用条件变量好像更稳妥点,大概意思就是让那个干活的线程自己检查一个“开工”信号,没信号就等着,主线程想让它开工了,就发个信号过去。这样线程是自己主动停下来的,不是被外面强行按暂停,感觉是安全点。
咋样了?
Windows上那个 `ResumeThread` 确实能用,应个急或者搞点简单测试还行。但我自己感觉,真要做项目,特别是跨平台的,或者对稳定性要求高点的,还是用条件变量这种方式比较靠谱。虽然写起来稍微麻烦一点点,要多定义个变量,还要加锁解锁啥的,但控制起来更精细,也更安全。实践下来,感觉还是得看具体情况用啥招,不能一根筋。
今天就先折腾到这,算是对这个线程暂停恢复有了点实际感受。下次再碰到类似需求,心里就有谱多了。