2.多线程系列文章 之 线程的控制
2010-09-30 16:57
363 查看
目录
2.1线程休眠2.2线程唤醒
2.3线程关闭
上回讲到
2.1线程休眠
想象一下一种情形,日常用的电脑,如果我们需要离开一段时间,那么可能会将它暂时休眠一下,为了节约用电,也响应一下环境保护,别忘了现在都讲低炭生活。那么线程其实也一样,如果一个线程暂时不需要用到,我们可以先让它睡会,其目的也是为了让它暂时不要占用资源,主要是一个cpu时间片的占用问题。
对于线程的休眠,只要简单调用Qthread的sleep,msleep或者usleep方法就可以了,注意这三个方法都是StaticProtected的,这意味着你只能在继承类里做这个动作,它们差别仅是时间单位不同而已。
程序方面我们尽量简单点,能看清本质就可以了,在Qthread派生类的Run方法里面用下
[/code]
2.2线程唤醒
既然有线程的休眠,那就有唤醒。如果你已经和线程说Sleep10秒吧,突然人家睡到一半的时候,你又改变主意想让它醒过来,这里我要抱歉的说声是没办法的,它就像猪一样,没到时间是不会醒的。比较合适的方案就是线程同步能够解决这样的问题,这个放到下一篇
2.3线程关闭
如果一个线程运行完了它会自己结束自己的生命。可很多情况不是这么简单,一个线程跑到中间的时候由于某种特殊原因,就想它中止。
2.3.1线程中止方式
中止有两种方式强制中止和优雅中止,这用词可能有点不恰当,先这么说着。在说明这两种方式之前,有必要详细说一下线程关闭的时候它到底干了什么。
线程关闭的时候,OS会移除这个线程,这部分对我们是透明的,详细的说明还得参阅操作系统的有关书籍,接着线程中分配的堆栈信息将一并清除,但是如果是堆上分配的信息,得由你负责自己清除,因为堆是由进程持有的,它的生命周期和线程没关系。
2.3.1.1强制中止:
简单的调用Qthread的方法terminate就可以进行强制中止,可这将会带来很多灾难性的后果。最为严重的就是一个堆内存泄露的问题,线程强制被中止,根本没法来得及做清理工作,即使你的线程中有执行到最后清理堆内存,可它没来得及执行
比如以下一段代码
想象一下线程还没执行到deletec;的时候你就发出了terminate,不幸的事就发生了,由此得出结论我们应该尽最大限度避免去使用。
2.3.1.2优雅的中止:
那么怎么优雅的关闭线程呢?我们应该通知线程,让线程自己去接手关闭,各自关注自己所需的事,就都能做得更好,一手抓就会带来很多问题
那么怎么通知线程呢?一般会采用以下的步骤
1.在Qthread中派生类定义一个公用方法出来供中止时调用,比如stop()
2.调用者直接调用stop方法
3.派生类stop方法,设置中止标志,一般就是bool成员
4.run方法运行的时候,检查bool成员,判断是否需要退出进程,最后做清理工作
//CThread.h
#defineCTHREAD_H
#include<QThread>
classCThread:publicQThread
{
public:
CThread();
~CThread();
voidstop();
protected:
voidrun();
private:
boolmStop;
};
#endif//CTHREAD_H
//CThread.cpp
#include"CThread.h"
CThread::CThread():QThread(),mStop(false)
{
}
CThread::~CThread()
{
stop();
}
voidCThread::run()
{
int*c=newint;
for(inti=1;i<=10000;i++)
{
if(mStop)//determinetoexittheloop
{
break;
}
qDebug()<<i;
sleep(1);
}
//cleanup
deletec;
}
voidCThread::stop()
{
mStop=true;
wait();
}
相关文章推荐
- Linux环境下多线程系列之线程控制
- 3.多线程系列文章 之 线程的同步[1/2]
- Java多线程开发系列之四:玩转多线程(线程的控制2)
- 1.多线程系列文章 之 线程的初体验
- Java多线程开发系列之四:玩转多线程(线程的控制1)
- Qt中多线程系列之线程控制
- Qt中多线程系列之线程控制
- Java多线程开发系列之四:玩转多线程(线程的控制2)
- java多线程系列2-线程控制
- Java多线程开发系列之四:玩转多线程(线程的控制1)
- Java多线程开发系列之四:玩转多线程(线程的控制1)
- Java多线程开发系列之四:玩转多线程(线程的控制2)
- Java多线程系列四——控制线程执行顺序
- 浅析 Qt中多线程系列之线程控制 下篇
- [C++ 2011 多线程系列一]如何创建线程
- JAVA多线程系列--线程实现方式
- linux网络编程之posix 线程(一):线程模型、pthread 系列函数 和 简单多线程服务器端程序
- Java多线程之线程控制(2)
- java并发包学习系列:几个多线程控制工具类(草稿)
- 小白菜系列之多线程(1)——创建线程