1、Linux 多线程概述
线程(thread
)是包含在进程内部的顺序执行流,是进程中的实际运作单位,也是操作系统能够进行调度的最小单位。一个进程
中可以并发
多条线程
,每条线程并行
执行不同的任务
。
线程
与进程
(Process
)的关系可以归结为以下几点:
序号 |
线程 |
进程 |
1 |
一个线程 只能属于一个进程 |
一个进程可以有多个线程,但至少有一个主线程 |
2 |
- |
资源分配给进程 ,同一进程 的所有线程 共享该进程 的所有资源 |
3 |
线程 作为调度 和分配 的基本单位 |
进程 作为拥有资源的基本单位 |
4 |
线程 不拥有系统资源 ,但可以访问隶属于进程 的资源 |
进程 是拥有资源的一个独立单位 |
5 |
- |
在创建 或撤销 进程时,由于系统要为之分配 和回收 资源,导致系统的开销大于创建 或撤销 线程时的开销 |
多进程
程序结构和多线程
程序结构有很大的不同,多线程程序结构相对于多进程程序结构有以下的优势:
序号 |
描述 |
1 |
线程间有方便的通信 和数据交换 机制 |
2 |
使用多线程可以加快应用程序 的响应 |
2、线程 管理
线程管理包含了线程的创建
、终止
、等待
、分离
、设置属性
等操作。
序号 |
函数 |
描述 |
1 |
pthread_create() |
创建 新线程 |
2 |
pthread_exit() |
终止 线程 |
3 |
pthread_detach() |
线程 分离 |
4 |
pthread_join() |
线程 连接 |
5 |
pthread_attr_init() |
初始化 属性对象 |
6 |
pthread_attr_destroy() |
销毁 属性对象 |
7 |
pthread_attr_getdetachstate() |
获取 线程 状态 |
8 |
pthread_attr_setdetachstate() |
设置 线程 状态 |
9 |
pthread_attr_getstacksize() |
获取 线程 栈 |
10 |
pthread_attr_setstacksize() |
设置 线程 栈 |
11 |
pthread_self() |
获取自己的线程ID |
12 |
pthread_equal() |
比较 两个线程 ID 是否相等 |
3、互斥量(Mutex)
互斥量
(Mutex
),又称为互斥锁
,是一种用来保护临界区
的特殊变量
,它可以处于锁定
(locked)状态,也可以处于解锁
(unlocked)状态:
序号 |
描述 |
1 |
如果互斥锁 是锁定 的,就是某个特定的线程 正持有这个互斥锁 |
2 |
如果没有线程 持有这个互斥锁 ,那么这个互斥锁就处于解锁 状态 |
每个互斥锁
内部有一个线程等待队列
,用来保存等待该互斥锁的线程。
当互斥锁处于解锁状态
时,如果某个线程试图获取这个互斥锁
,那么这个线程就可以得到
这个互斥锁而不会阻塞
当互斥锁处于锁定状态
时,如果某个线程试图获取这个互斥锁
,那么这个线程将阻塞
在互斥锁的等待队列
内。
互斥量
是最简单也是最有效的线程同步机制
。程序可以用它来保护临界区
,以获得对排它性资源
的访问权。另外,互斥量
只能被短时间地持有,使用完临界资源后应立即释放锁。
序号 |
函数 |
描述 |
1 |
pthread_mutex_init() |
创建 互斥量(动态初始化) |
2 |
pthread_mutex_destroy() |
销毁 互斥量 |
3 |
pthread_mutex_lock() |
加锁 (线程 试图锁定互斥量 的过程) |
4 |
pthread_mutex_trylock() |
尝试加锁 |
5 |
pthread_mutex_unlock() |
解锁 (将互斥量由锁定状态 变为解锁状态 ) |
死锁
是指两个
或两个以上
的执行序列在执行过程中,因争夺资源
而造成的一种互相等待
的现象。