分类: 嵌入式
2011-04-14 09:05:28
POSIX线程(thread)
APUE中没有讲到线程的知识,所以在网上找份华清的资料和我以前买的红皮书(Linux程序设计)搭配着看。红皮书是本不错的书,深入浅出,很适合初学者。
1线程进程是系统中程序执行和资源分配的基本单位。
每个进程都拥有自己的数据段代码段和堆栈段,这就造成了进程在进行切换等操作是都需要有比较负责的上下文切换等动作。
线程是一个进程内部的一个控制序列(这是红皮书上写的,看的中文版的,有点不好理解,不晓得有没有翻译错)。
线程是一个进程内部的基本调度单位,也可以称为轻量级进程。
1.2 线程产生的原因进程间的切换开销太大,所以才引进了线程。
进程新建一个线程,线程将拥有自己的栈(因此也有自己的局部变量),但与它创建者共享全局变量、文件描述符、信号处理函数和当前目录状态。
1.3 线程和进程的关系一个进程可以有多个线程,也就是由多个线程控制表及堆栈寄存器,但是却共享一个用户地址空间。
注意:由于线程共享了进程的资源和地址空间,因此,任何线程对系统资源的操作都会给其他线程带来影响。
这图是根据《现代操作系统第三版》画的。
线程状态包括:创建、等待、就绪、运行和终止。
1.4 线程分类
线程按照其调度者可以分为用户级线程和内核级线程。
用户级线程
主要解决的是上下文切换的问题,它的调度算法和调度过程全部是由用户自行选择决定,在运行时不需要特定的内核支持。在这里操作系统往往会提供一个用户空间的线程库,而内核仍然仅对进程进行管理。
如果一个进程中的某个线程调用了一个阻塞的系统调用,那么该线程包括该进程中的其他所有线程也同时被阻塞。
所以用户及线程的主要缺点是在一个进程中的多个线程的调度中无法发挥多处理器的优势。
内核级线程
这种线程与许不同进程中的线程按照同一相对优先调度方法进行调度,这样就可以发挥多处理器的并发优势。
现代大多数系统都采用用户级线程与内核级线程并存的方法。
2 线程实现函数的介绍就不多说,很多资料都讲的很清楚,英语好的话就man
编写多线程程序时,我们通过定义宏_REENTRANT来告诉编译器我们需要可重入功能。所以在编译多线程程序时:
Gcc –D_REENTRANT thread.c –o thread -lphtread
3 同步有两组结构函数用于信号量。一组取自于POSIX的实时扩展,用于线程。另一组被称为系统V信号,常用于进程的同步。
信号量是一个特殊类型的变量,它可以被增加或减少,但对其的关键访问被保证是原子操作。
我们是使用最简单的信号量—二进制信号量,它只有0和1两种取值。还有一种更通用的信号量—计数信号量,但是并不常用。
3.2 使用互斥量同步一种用在多线程程序中的同步访问方法是使用互斥量,它允许程序员锁住某个对象,使得每次只能有一个线程访问它。为了控制对关键代码的访问,必须在进入这段代码之前锁住一个互斥量,然后完成操作之后解锁它。
水平有限,如果有错误的地方,请指正,thanks
cjok.liao@gmail.com