前一阵子写了一个后台不断求质数的程序。一共实现两个功能:一、运行的开始/暂停;二、重新开始计算。其中开始/暂停部分需要挂起负责查找质数的线程。但是我看了好几遍文档发现居然没有挂起线程的函数……
搜索了很久发现,原来POSIX线程模型中是不包括挂起功能的。因为挂起一个现成会导致该线程占有的资源得不到释放。只要线程还在挂起,那么它占有的资源就一直处于被占用状态。所以POSIX模型把这个权利交给了操作系统的设计者。
于是,解决方案就是使用锁。
boost和QT都是使用了POSIX线程模型,所以都是没有挂起函数的。
于2012-02-06添加:
经实践后发现,QT的QMutex是不允许在线程 B中解锁线程A中锁定的QMutex对象的。所以以我目前的知识,QT内部是不存在挂起线程的方法了。只能每次运行的时候判断下是否允许运行了。
boost的锁倒是可以,但是它的实际运行状况只能用 “诡异”来形容……
具体解决方案仍待继续实践啊!
于2016-06-18添加:
挂起线程应该使用条件变量。wait挂起,notify唤醒。标准库,Qt,操作系统都提供了相关的函数,具体使用方法网上一搜一大把。
需要注意的是,条件变量是为线程同步设计的工具,目的是多线程的情况下保证资源的有序访问。
所以它需要跟锁一起使用。如果你看到了传锁作为参数,不要觉得奇怪。