• ole2高级编程技术pdf > 高级线程编程
  • 高级线程编程

    免费下载 下载该文档 文档格式:PDF   更新时间:2000-11-01   下载次数:0   点击次数:1
    文档基本属性
    文档语言:Simplified Chinese
    文档格式:pdf
    文档作者:zqs
    关键词:
    主题:
    备注:
    点击这里显示更多文档属性
    下载
    下载
    下载
    第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函数. 我们可以使用一个办法弥补此缺陷.我们可以在父线程中插入一个延迟程序,给子线程足 够的时间完成打印的调用.同样,在调用第二个之前也插入一个延迟程序保证第一个线程在第 二个线程执行之前完成任务.

    下一页

  • 下载地址 (推荐使用迅雷下载地址,速度快,支持断点续传)
  • 免费下载 PDF格式下载
  • 您可能感兴趣的
  • c语言高级编程技术pdf  linux编程技术详解pdf  inux编程技术详解pdf  unix环境高级编程pdf  php6高级编程pdf  c#高级编程第七版pdf  c#高级编程pdf  c#高级编程第4版pdf  c语言高级编程pdf