Linux 下的 C 编程实战之四
1.Linux“
”
线程
Linux 内核只提供了轻量进程的支持,未实现线程模型,但 Linux 尽最大努力优化了
进程的调度开销,这在一定程度上弥补无线程的缺陷。Linux 用一个核心进程(轻量进
程)对应一个线程,将线程调度等同于进程调度,交给核心完成。
笔者曾经在《基于嵌入式操作系统 VxWorks 的多任务并发程序设计》(《软件
报》2006 年第 5~12 期)中详细叙述了进程和线程的区别,并曾经说明 Linux
“
是一种 多
”
进程单线程 的操作系统。Linux
“
”
本身只有进程的概念,而其所谓的 线程 本质上在内核
里仍然是进程。大家知道,进程是资源分配的单位,同一进程中的多个线程共享该进程
的资源(如作为共享内存的全局变量)。Linux
“
”
“
中所谓的 线程 只是在被创建的时候 克
”
隆 (clone)了父进程的资源,因此,clone
“
”
出来的进程表现为 线程 ,这一点一定要弄清
楚。因此,Linux“
”
线程 这个概念只有在打冒号的情况下才是最准确的,可惜的是几乎没
有书籍留心去强调这一点。
目前 Linux 中最流行的线程机制为 LinuxThreads
“
,所采用的就是线程-进程 一对
”
一 模型,调度交给核心,而在用户级实现一个包括信号处理在内的线程管理机制。
LinuxThreads 由 Xavier Leroy (Xavier.Leroy@inria.fr)负责开发完成,并已绑定在 GLIBC
中发行,它实现了一种 BiCapitalized 面向 Linux 的 Posix 1003.1c “pthread”标准接口。
Linuxthread 可以支持 Intel、Alpha、MIPS 等平台上的多处理器系统。
按照 POSIX 1003.1c 标准编写的程序与 Linuxthread 库相链接即可支持 Linux 平台上
的多线程,在程序中需包含头文件 pthread. h,在编译链接时使用命令:
gcc -D -REENTRANT -lpthread xxx. c
其中-REENTRANT 宏使得相关库函数(如 stdio.h、errno.h 中函数) 是可重入的、线
程安全的(thread-safe),-lpthread 则意味着链接库目录下的 libpthread.a 或 libpthread.so
文件。使用 Linuxthread 库需要 2.0 以上版本的 Linux 内核及相应版本的 C 库(libc
5.2.18、libc 5.4.12、libc 6)。
2.“
”
线程 控制
线程创建
进程被创建时,系统会为其创建一个主线程,而要在进程中创建新的线程,则可以
调用 pthread_create:
pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *
(start_routine)(void*), void *arg);
start_routine 为新线程的入口函数,arg 为传递给 start_routine 的参数。
每个线程都有自己的线程 ID,以便在进程内区分。线程 ID 在 pthread_create 调用时
回返给创建线程的调用者;一个线程也可以在创建后使用 pthread_self()调用获取自己的
线程 ID:
pthread_self (void) ;
线程退出
线程的退出方式有三:
(1)执行完成后隐式退出;