欢迎来到天天文库
浏览记录
ID:46790730
大小:166.50 KB
页数:27页
时间:2019-11-27
《linux线程详细讲解》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、......POSIX线程详解一种支持内存共享的简捷工具级别:初级DanielRobbins(drobbins@gentoo.org),总裁/CEO,GentooTechnologies,Inc.2000年7月01日POSIX(可移植操作系统接口)线程是提高代码响应和性能的有力手段。在本系列中,DanielRobbins向您精确地展示在编程中如何使用线程。其中还涉及大量幕后细节,读完本系列文章,您完全可以运用POSIX线程创建多线程程序。线程是有趣的了解如何正确运用线程是每一个优秀程序员必备的素质。线程类似于进程。如同进程,线程
2、由内核按时间分片进行管理。在单处理器系统中,内核使用时间分片来模拟线程的并发执行,这种方式和进程的相同。而在多处理器系统中,如同多个进程,线程实际上一样可以并发执行。那么为什么对于大多数合作性任务,多线程比多个独立的进程更优越呢?这是因为,线程共享相同的内存空间。不同的线程可以存取内存中的同一个变量。所以,程序中的所有线程都可以读或写声明过的全局变量。如果曾用fork()编写过重要代码,就会认识到这个工具的重要性。为什么呢?虽然fork()允许创建多个进程,但它还会带来以下通信问题:如何让多个进程相互通信,这里每个进程都有各自独
3、立的内存空间。对这个问题没有一个简单的答案。虽然有许多不同种类的本地IPC(进程间通信),但它们都遇到两个重要障碍:·强加了某种形式的额外内核开销,从而降低性能。·对于大多数情形,IPC不是对于代码的“自然”扩展。通常极大地增加了程序的复杂性。双重坏事:开销和复杂性都非好事。如果曾经为了支持IPC而对程序大动干戈过,那么您就会真正欣赏线程提供的简单共享内存机制。由于所有的线程都驻留在同一内存空间,POSIX线程无需进行开销大而复杂的长距离调用。只要利用简单的同步机制,程序中所有的线程都可以读取和修改已有的数据结构。而无需将数据经
4、由文件描述符转储或挤入紧窄的共享内存空间。仅此一个原因,就足以让您考虑应该采用单进程/多线程模式而非多进程/单线程模式。线程是快捷的不仅如此。线程同样还是非常快捷的。与标准fork()相比,线程带来的开销很小。内核无需单独复制进程的内存空间或文件描述符等等。这就节省了大量的CPU时间,使得线程创建比新进程创建快上十到一百倍。因为这一点,可以大量使用线程而无需太过于担心带来的CPU或内存不足。使用fork()学习好帮手......时导致的大量CPU占用也不复存在。这表示只要在程序中有意义,通常就可以创建线程。当然,和进程一样,线程
5、将利用多CPU。如果软件是针对多处理器系统设计的,这就真的是一大特性(如果软件是开放源码,则最终可能在不少平台上运行)。特定类型线程程序(尤其是CPU密集型程序)的性能将随系统中处理器的数目几乎线性地提高。如果正在编写CPU非常密集型的程序,则绝对想设法在代码中使用多线程。一旦掌握了线程编码,无需使用繁琐的IPC和其它复杂的通信机制,就能够以全新和创造性的方法解决编码难题。所有这些特性配合在一起使得多线程编程更有趣、快速和灵活。线程是可移植的如果熟悉Linux编程,就有可能知道__clone()系统调用。__clone()类似于
6、fork(),同时也有许多线程的特性。例如,使用__clone(),新的子进程可以有选择地共享父进程的执行环境(内存空间,文件描述符等)。这是好的一面。但__clone()也有不足之处。正如__clone()在线帮助指出:“__clone调用是特定于Linux平台的,不适用于实现可移植的程序。欲编写线程化应用程序(多线程控制同一内存空间),最好使用实现POSIX1003.1c线程API的库,例如Linux-Threads库。参阅pthread_create(3thr)。”虽然__clone()有线程的许多特性,但它是不可移植的。
7、当然这并不意味着代码中不能使用它。但在软件中考虑使用__clone()时应当权衡这一事实。值得庆幸的是,正如__clone()在线帮助指出,有一种更好的替代方案:POSIX线程。如果想编写可移植的多线程代码,代码可运行于Solaris、FreeBSD、Linux和其它平台,POSIX线程是一种当然之选。第一个线程下面是一个POSIX线程的简单示例程序:thread1.c#include#include#includevoid*thread_function(void*
8、arg){inti;for(i=0;i<20;i++){printf("Threadsayshi!");sleep(1);}returnNULL;}intmain(void){学习好帮手......pthread_tmythread;if(pthread_c
此文档下载收益归作者所有