欢迎来到天天文库
浏览记录
ID:14518670
大小:196.00 KB
页数:6页
时间:2018-07-29
《多线程应用程序设计》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、多线程应用程序设计摘要:嵌入式操作系统是一种支持嵌入式系统应用的操作系统软件,它是嵌入系统极为重要的组成部分。嵌入式操作系统具有能够有效管理越来越复杂的系统资源,能够把硬件虚拟化,能够提供库函数、驱动程序及工具集等特点。Linux是最常见的嵌入式操作系统。目前Linux已广泛应用于信息家电、数据网络、工业控制、医疗卫生航空航天等众多领域。在本文中主要介绍多线程应用程序设计,通过编写经典的“生产者消费者”问题的实验,可以进一步熟悉Linux中的多线程编程,并且掌握用信号量处理线程间的同步和互斥问题。Linux多线程编程更好的熟悉在Linux下进行编程的方法,熟悉ARM开发板的使用和开
2、发环境的设置以及熟悉几个重要的PTHREAD库函数的使用,掌握共享锁和信号量的使用方法。关键词:嵌入式、多线程编程、互斥锁、条件变量一、课题介绍在嵌入式系统中,进程是程序执行和资源分配的基本单位。每个进程都拥有自己的数据段、代码段和堆栈段,这就造成了进程在进行切换等操作时都需要有比较复杂的上下文切换等动作。为了进一步减少处理机的空转时间,支持多处理器以及减少上下文切换开销,进程在演化中出现了另一个概念——线程。它是进程内独立的一条运行路线,处理器调度的最小单元,也可以称为轻量级进程。线程可以对进程的内存空间和资源进行访问,并与同一进程中的其他线程共享。因此,线程的上下文切换的开销比
3、创建进程小很多。同进程一样,线程也将相关的执行状态和存储变量放在线程控制表内。一个进程可以有多个线程,也就是有多个线程控制表及堆栈寄存器,但却共享一个用户地址空间。在多线程系统中,进程与进程的关系如图1.1所示。图1.1进程与线程关系二、课题原理(一)线程与多线程为什么有了进程的概念后,还要再引入线程呢?理由一是和进程相比,它是一种非常"节俭"的多任务操作方式。我们知道,在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享
4、大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。据统计,总的说来,一个进程的开销大约是一个线程开销的30倍左右。理由二是线程间方便的通信机制。对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。线程却不一样,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便。当然,数据的共享也带来其他一些问题,有的变量不能同时被两个线程所修改,有的子程序中声明为static的数据更有可能给多线程程序带来灾
5、难性的打击,这些正是编写多线程程序时最需要注意的地方。那么使用多线程有什么的优点呢?多线程程序作为一种多任务、并发的工作方式,优点有:(1)提高应用程序响应。这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作置于一个新的线程,可以避免这种情况。(2)使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。(3)改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。(二)线程库函数L
6、inux系统下的多线程遵循POSIX(PortableOperatingSystemInterfaceofUnix/可移植性操作系统接口标准)线程接口,称为pthread。编写Linux下的多线程程序,需要使用头文件pthread.h。POSIX标准是由IEEE(电气和电子工程师协会)开发,是由ANSI(美国国家标准学会)和ISO(国际标准化组织)标准化。Linux创建进程所使用的函数是fork()或者vfork()。而对线程的创建和管理Linux可以使用POSIX的线程库pthreads提供的APIs(应用编程接口)。接下来介绍线程库函数。线程库中用于创建和管理线程的函数主要有6
7、个,它们是:pthread_create()用于创建线程;pthread_join()用于等待线程结束;pthread_self()用于获取线程ID号;pthread_detach()用于让线程脱离;pthread_exit()用于终止线程;pthread_cancel()用于取消线程。创建线程实际上就是确定调用该线程函数的入口点,这里通常使用的函数是pthread_create()。原型为:externintpthread_create((pthread_t*_th
此文档下载收益归作者所有