[Linux] 第 12 章 POSIX 线程
fork调用来创建新进程的代价太高。
*1 在进程中创建新线程
*2 在一个进程中同步线程之间的数据访问
*3 修改线程属性
*4 在同一个进程中,从一个线程中控制另一个线程。
@1,程序中的多个执行路线就叫做线程。线程是进程内部的一个控制序列。
@2, 弄清楚fork系统调用和创建新线程之间的区别非常重要。
当进程执行fork调用时,将创建出该进程的一份新副本。这个新进程有自己的
变量,完全独立于父进程。
创建新线程的时候,新的执行线程将有自己的桟,但与它的创建者共享全局变量,
,文件描述符,信号处理函数和当前目录状态。
@3,多核处理器,大多数机器在底层硬件上就已物理支持了同时执行多个线程,单核
CPU线程同时执行就是一个幻想。
@4,如何将用户级的线程映射到内核级的线程。
** 线程的优点和缺点
创建新线程比建进程代价小得多。
* 同时执行
验证两个线程的执行是同时进行的(当然,如果是在一个单处理器系统上,线程的
同时执行就需要考CPU在线程之间的快速切换来实现)。未介绍线程同步函数。
* 同步
线程同时执行,采用在它们之间进行切换的方法很笨。幸运的是,专门有一组设计好的
函数为我们提供了更好的控制线程执行和访问代码临界区域的方法。
二种方法 『
1,信号量 : 看守一段代码的看门人。
2,互斥量 : 保护代码段的一个互斥设备。
例如 : 如果想控制任一时刻只能有一个线程可以访问一些共享内存,使用互斥量好。
』
@1,用信号量进行同步 『
有两组接口函数用于信号量。一组取自POSIX的实时扩展用于线程。另一组被成为系统
V信号量,常用于进程的同步
Dijkstra提出了信号量的概念。
一种最简单的信号量 : 二进制信号量。
一种最通用的信号量 : 计数信号量。
信号量一般常常用来保护一段代码,使其每次只能被一个执行线程运行,要完成这个工作
就要使用二进制信号量。有时我们允许有限数目的线程执行一段指定的代码,用计数型信号量。
原子操作 指:如果两个线程企图同时给一个信号量加1,它们之间不会互相干扰,二不像如果
两个程序同时对同一个文件进行读取,增加,写入操作时可能会引起冲突。
}
** 线程的属性
* 假设我们在主线程继续为用户提供服务的同时创建了第二个线程,新线程的作用是将用户
正在编辑的数据文件进行存储备份,备份结束,第二个线程就可以直接终止了!
** 取消一个线程
* 一个线程可以要求另一个线程终止,就像给它发送一个信号一样!
** 多线程
总结 : 如何在一个进程中创建多个执行线程,每个线程共享着文件范围的变量,
。线程对关键代码和数据的两种访问控制方法 ---- 使用信号量和互斥量。
如何控制线程的属性,如何才能将子线程与主线程分离开来,使主线程无需等
待它创建的子线程终止运行。
*1 在进程中创建新线程
*2 在一个进程中同步线程之间的数据访问
*3 修改线程属性
*4 在同一个进程中,从一个线程中控制另一个线程。
@1,程序中的多个执行路线就叫做线程。线程是进程内部的一个控制序列。
@2, 弄清楚fork系统调用和创建新线程之间的区别非常重要。
当进程执行fork调用时,将创建出该进程的一份新副本。这个新进程有自己的
变量,完全独立于父进程。
创建新线程的时候,新的执行线程将有自己的桟,但与它的创建者共享全局变量,
,文件描述符,信号处理函数和当前目录状态。
@3,多核处理器,大多数机器在底层硬件上就已物理支持了同时执行多个线程,单核
CPU线程同时执行就是一个幻想。
@4,如何将用户级的线程映射到内核级的线程。
** 线程的优点和缺点
创建新线程比建进程代价小得多。
* 同时执行
验证两个线程的执行是同时进行的(当然,如果是在一个单处理器系统上,线程的
同时执行就需要考CPU在线程之间的快速切换来实现)。未介绍线程同步函数。
* 同步
线程同时执行,采用在它们之间进行切换的方法很笨。幸运的是,专门有一组设计好的
函数为我们提供了更好的控制线程执行和访问代码临界区域的方法。
二种方法 『
1,信号量 : 看守一段代码的看门人。
2,互斥量 : 保护代码段的一个互斥设备。
例如 : 如果想控制任一时刻只能有一个线程可以访问一些共享内存,使用互斥量好。
』
@1,用信号量进行同步 『
有两组接口函数用于信号量。一组取自POSIX的实时扩展用于线程。另一组被成为系统
V信号量,常用于进程的同步
Dijkstra提出了信号量的概念。
一种最简单的信号量 : 二进制信号量。
一种最通用的信号量 : 计数信号量。
信号量一般常常用来保护一段代码,使其每次只能被一个执行线程运行,要完成这个工作
就要使用二进制信号量。有时我们允许有限数目的线程执行一段指定的代码,用计数型信号量。
原子操作 指:如果两个线程企图同时给一个信号量加1,它们之间不会互相干扰,二不像如果
两个程序同时对同一个文件进行读取,增加,写入操作时可能会引起冲突。
}
** 线程的属性
* 假设我们在主线程继续为用户提供服务的同时创建了第二个线程,新线程的作用是将用户
正在编辑的数据文件进行存储备份,备份结束,第二个线程就可以直接终止了!
** 取消一个线程
* 一个线程可以要求另一个线程终止,就像给它发送一个信号一样!
** 多线程
总结 : 如何在一个进程中创建多个执行线程,每个线程共享着文件范围的变量,
。线程对关键代码和数据的两种访问控制方法 ---- 使用信号量和互斥量。
如何控制线程的属性,如何才能将子线程与主线程分离开来,使主线程无需等
待它创建的子线程终止运行。