第12章——并发编程
创始人
2024-02-01 18:34:29
0次
- 如果逻辑控制流在时间上重叠,那么它们就是并发的
- 使用应用级并发的应用程序称为并发程序,现在操作系统提供三种基本的构造并发程序的方法:进程、I/O多路复用、线程
基于进程的并发编程
- 一个构造并发服务器的自然方法就是,在父进程中接受客户端连接请求,然后创建一个新的子进程来为每个新客户端提供服务
基于I/O多路复用的并发编程
- 使用
select
函数,要求内核挂起进程,只有在一个或多个I/O事件发生后,才将控制返回给应用程序 - 并发粒度就是读一个完整的文本行所需要的指令数量
基于线程的并发编程
- 线程是运行在进程上下文中的逻辑流
- 每个进程开始生命周期时都是单一线程,这个线程称为主线程。在某一时刻,主线程创建一个对等线程,从这个时间点开始,两个线程就并发的运行。最后,因为主线程执行一个慢速系统调用,或者因为被系统的间隔计时器中断,控制就会通过上下文切换传递到对等线程
多线程程序中的共享变量
- 一组并发线程运行在一个进程的上下文中,每个线程都有它自己独立的线程上下文,每个线程和其他线程一起共享进程上下文的剩余部分
用信号量同步线程
- 进度图将n个并发线程的执行模型化为一条n为笛卡尔空间中的轨迹线
- 信号量是具有非负整数值的全局变量,只能有两种特殊的操作来处理,这两种操作称为P和V
- 信号量提供了一种很方便的方法来确保对共享变量的互斥访问,基本思想是将每个共享变量与一个信号量s联系起来,然后用P(s)和V(s)操作将相应的临界区包围起来
- 生产者-消费者问题:生产者产生项目并把它们插入到一个有限的缓冲区中,消费者从缓冲区中取出这些项目,然后消费它们
- 读者-写者问题:一组并发的线程要访问一个共享对象,有些线程只读对象,称为读者,其他的线程只修改对象,称为写者,写者必须拥有对对象的独占访问
使用线程提高并行性
- 并行程序是一个运行在多个处理器上的并发程序,并行程序的集合是并发程序集合的真子集
- 同步开销巨大,要尽可能避免。如果无可避免,必须要用尽可能多的有用计算弥补这个开销
其他并发问题
- 一个函数被称为线程安全的,当且仅当被多个并发线程反复地调用时,它会一直产生正确的结果
- 可重入函数:当它们被多个线程调用时,不会引用任何共享数据,可重入函数集合是线程安全函数的一个真子集
- 死锁:一组线程被阻塞了,等待一个永远也不会为真的条件
相关内容