下载
下载
下载
第20章 高级线程编程
本章从线程的基本概念入手,介绍 Linux的高级编程内容.
20.1 线程的概念和用途
线程通常叫做轻型的进程.虽然这个叫法有些简单化,但这有利于了解线程的概念.线程 和UNIX系统中的进程十分接近,要了解这两者之间的区别,我们应该看一下 UNIX系统中的进 程和Mach的任务和线程之间的关系.在 UNIX系统中,一个进程包括一个可执行的程序和一系 列的资源,例如文件描述符表和地址空间.在 M a c h中,一个任务仅包括一系列的资源;线程 处理所有的可执行代码.一个 M a c h的任务可以有任意数目的线程和它相关,同时每个线程必 须和某个任务相关.和某一个给定的任务相关的所有线程都共享任务的资源.这样,一个线程 就是一个程序计数器,一个堆栈和一系列的寄存器.所有需要使用的数据结构都属于任务.一 个UNIX系统中的进程在Mach中对应于一个任务和一个单独的线程. 因为线程和进程比起来很小,所以相对来说,线程花费更少的 CPU资源.进程往往需要它 们自己的资源,但线程之间可以共享资源,所以线程更加节省内存. M a c h的线程使得程序员 可以编写并发运行的程序,而这些程序既可以运行在单处理器的机器上,也可以运行在多处理 器的机器中.另外,在单处理器环境中,当应用程序执行容易引起阻塞和延迟的操作时,线程 可以提高效率.
20.2 一个简单的例子
用子函数pthread_create创建一个新的线程.它有四个参数:一个用来保存线程的线程变量, 一个线程属性,当线程执行时要调用的函数和一个此函数的参数.例如:
pthread_t pthread_attr_t void char a_thread; a_thread_attribute; thread_function(void *argument); *some_argument;
pthread_create( &a_thread, a_thread_attribute, (void *)&thread_function, (void *) &some_argument);
线程属性只指明了需要使用的最小的堆栈大小.在以后的程序中,线程的属性可以指定其 他的值,但现在大部分的程序可以使用缺省值.不像 U N I X系统中使用 f o r k系统调用创建的进 程,它们和它们的父进程使用同一个执行点,线程使用在 pthread_create中的参数指明要开始执 行的函数. 现在我们可以编制第一个程序了.我们编制一个多线程的应用程序,在标准输出中打印 "Hello World" .首先我们需要两个线程变量,一个新线程开始执行时可以调用的函数.我们还 需要指明每一个线程应该打印的信息.一个做法是把要打印的字符串分开,给每一个线程一个 字符串作为开始的参数.请看下面的代码:
void print_message_function( void *ptr );
216
计计第四篇 Linux 系统高级编程
下载
main() { pthread_t thread1, thread2; char *message1 = "Hello"; char *message2 = "World"; pthread_create( &thread1, pthread_attr_default, (void*)&print_message_function, (void*) message1); pthread_create(&thread2, pthread_attr_default, (void*)&print_message_function, (void*) message2); exit(0); } void print_message_function( void *ptr ) { char *message; message = (char *) ptr; printf("%s ", message); }
程序通过调用 p t h r e a d _ c r e a t e创建第一个线程,并将" H e l l o"作为它的启动参数.第二个 线程的参数是" Wo r l d " .当第一个线程开始执行时,它使用参数" H e l l o "执行函数 print_message_function.它在标准输出中打印" Hello" ,然后结束对函数的调用.线程当离开 它的初始化函数时就将终止,所以第一个线程在打印完" H e l l o"后终止.当第二个线程执行 时,它打印"World"然后终止.但这个程序有两个主要的缺陷. 首先也是最重要的是线程是同时执行的.这样就无法保证第一个线程先执行打印语句.所 以你很可能在屏幕上看到" World Hello" ,而不是"Hello World" .请注意对exit的调用是父线 程在主程序中使用的.这样,如果父线程在两个子线程调用打印语句之前调用 exit,那么将不 会有任何的打印输出.这是因为 exit函数将会退出进程,同时释放任务,所以结束了所有的线 程.任何线程 (不论是父线程或者子线程 )调用exit 都会终止所有其他线程.如果希望线程分别 终止,可以使用 pthread_exit函数. 我们可以使用一个办法弥补此缺陷.我们可以在父线程中插入一个延迟程序,给子线程足 够的时间完成打印的调用.同样,在调用第二个之前也插入一个延迟程序保证第一个线程在第 二个线程执行之前完成任务.
- ole2高级编程技术pdf > 高级线程编程
-
高级线程编程
下载该文档 文档格式:PDF 更新时间:2000-11-01 下载次数:0 点击次数:1文档基本属性 文档语言: Simplified Chinese 文档格式: pdf 文档作者: zqs 关键词: 主题: 备注: 点击这里显示更多文档属性 经理: 单位: jwc 分类: 创建时间: 上次保存者: 修订次数: 编辑时间: 文档创建者: 修订: 加密标识: 幻灯片: 段落数: 字节数: 备注: 演示格式: 上次保存时间:
- 下载地址 (推荐使用迅雷下载地址,速度快,支持断点续传)
- PDF格式下载
- 更多文档...
-
上一篇:TC高级编程
下一篇:高性能计算之并行编程技术
点击查看更多关于ole2高级编程技术pdf的相关文档
- 您可能感兴趣的
- c语言高级编程技术pdf linux编程技术详解pdf inux编程技术详解pdf unix环境高级编程pdf php6高级编程pdf c#高级编程第七版pdf c#高级编程pdf c#高级编程第4版pdf c语言高级编程pdf
- 大家在找
-
- · 自动升降旗
- · 英语六级考试报名时间
- · 机动车驾驶理论题库
- · 台湾摩托车品牌
- · 普特英语听力免费下载
- · 西门子plc模块说明书
- · 一年级语文期中试卷
- · 怀孕的脉象是什么样的
- · 韩语flash
- · 数控车床加工圆弧视频
- · 文秘职业规划书
- · 苏州吴江盛泽简介
- · 假花仿真花
- · NewEditionSUPERKIDS
- · dnf技能美化修改器
- · 网络pos易宝财付通
- · 读后感当好领导
- · 土方计算软件
- · 联想sl400说明书
- · 2010年深圳中考试题
- · 狂野角斗士2012年约翰
- · 北京长安事件维基百科
- · 三年级英语上册2单元
- · 洛阳理工学院就业网
- · 大唐双龙传之长生诀全
- · nokian72怎么取出电池
- · 北京中科魔
- · 奇瑞qq3电动版
- · 世界现代设计史课件
- · 七年级语文名师课堂
- 赞助商链接