线程控制方法

时间:2022-07-25 02:17:45

线程控制方法

摘 要:在只有一块CPU的电脑上,CPU可以轮流执行多个程序,我们将一个进程中运行的多个程序称为线程。在多线程的操作系统中,每个线程都是作为利用CPU的基本单位,是花费最小开销的实体。本文讲述了线程的属性、控制等问题。

关键词:线程 信号量 挂起与解挂

中图分类号:TN919.8 文献标识码:A 文章编号:1674-098X(2013)04(c)-0051-01

1 线程的属性与状态

线程具有4个属性:(1)轻型级:线程中的实体基本上不拥有系统资源,只是有一点必不可少的、能保证独立运行的资源。(2)独立调度和分派的基本单位:线程是能独立运行的基本单位,因而也是独立调度和分派的基本单位。(3)可并发执行:在一个进程中的多个线程之间,可以并发执行,甚至允许在一个进程中所有线程都能并发执行;同样,不同进程中的线程也能并发执行。(4)共享进程资源:在同一进程中的各个线程,都可以共享该进程所拥有的资源,比如,所有线程都具有相同的地址空间,线程可以访问该地址空间的每一个虚地址,还可以访问进程所拥有的已打开文件、定时器、信号量等。

new为新生线程,它还没有运行。一旦调用start方法,线程进入runnable可运行状态。在可运行状态中的线程不一定始终运行,这依赖操作系统的服务。当一个线程试图获取一个内部的对象锁,而该锁被其他线程持有,线程进入blocked阻塞状态。当线程等待另一个线程通知调度器一个条件时,进入waiting等待状态。当使用超时参数时,会导致线程进入timed waiting计时等待状态。在阻塞状态和等待状态的线程所需的条件满足时,它们会回到runnable可运行状态。当run方法正常退出或因为一个没有捕获的异常终止了run方法及调用stop方法杀死线程时,线程进入terminated终止状态。

2 VC下的线程控制

在VC下每一个应用程序都有一个默认线程,这个线程就是应用程序类。线程经历了创建、运行、挂起、唤醒、结束的过程。在一个线程的整个生存周期中,三个重要成员函数的执行顺序是:InitInstance()->Run()->ExitInstance()。其中Run()是线程的核心,通常,Run当中要包含一个无限循环,使得线程能够一刻不停地在后台工作。线程创建过程是:从CWinThread类派生你的线程;将构造函数的Protected属性改为Public属性;在ClassWizzard中增加Run函数;在 Run函数中写一个无限循环,线程要执行的工作在无限循环中进行;将线程的头文件包含到创建线程的CPP文件中;线程实例化;指定线程的附属窗口;用线程的CreateThread()成员函数启动线程。

3 线程挂起和唤醒

在视图的OnInitUpdate函数中可以为线程创建挂起信号灯和唤醒信号灯,这两个信号灯的创建也需要在线程创建之前完成。增加线程挂起按钮和唤醒按钮,并增加响应函数;在线程Run函数的死循环中,检查信号灯的代码后面,增加挂起信号灯的检查代码:检查挂起信号灯是否被主线程点亮,如果没有被点亮,则线程正常工作;如果被点亮,则线程进入挂起状态:即以无限等待唤醒方式点亮信号灯。还要增加挂起按钮响应函数,并做如下事情:点亮挂起信号灯,关闭唤醒信号灯。继续增加唤醒按钮及响应函数,并做如下事情:点亮唤醒信号灯,关闭挂起信号灯。

4 结束线程

主线程向后台线程发出无限循环结束请求,并无限等待应答;后台线程结束无限循环后,向主线程报告无限循环已经结束;主线程连续向后台线程发送请求释放资源消息,并无限等待应答;后台线程收到释放资源消息后,向主线程发出允许释放资源应答;这样在视图的OnInitUpdate函数中创建所需要的3个信号灯,这3个信号灯的创建需要在线程创建之前完成,并增加结束线程的按钮和响应函数。

5 线程控制流程示例

以上讲述的内容可以用图2来表示。

6 结语

近年来推出的各种通用操作系统都引入了线程,以便进一步提高系统的并发性,并把它视为现代操作系统的一个重要指标。线程的使用非常普遍,在各种语言环境中灵活的应用是非常重要的。本文试图论述它一般的使用方法,从而丰富我们课堂的教学内容。

参考文献

[1] 韦朴.VC通用范例开发金典[M].北京:电子工业出版社,2008.

[2] 林建素.Eclipse开发[M].北京:电子工业出版社,2008.

上一篇:几种常用地面磁测数据滤波处理方法的编程实现 下一篇:浅谈数据挖掘