阅读更多
一个并发程序是由在时间上重叠的一组逻辑流组成的
三种不同的构建并发程序的机制:进程、I/O多路复用和线程
进程是由内核自动调度的,而且因为它们有各自独立的虚拟地址空间,所以要实现共享数据,它们需要显示的IPC机制
事件驱动程序创建它们自己的并发逻辑流,这些逻辑流被模型化为状态机,用I/O多路复用来显示地调度这些流
因为程序运行在一个单一进程中,所以在流之间共享数据速度很快而且很容易
线程是这些方法的综合,同基于进程的流一样,线程是由内核自动调度的
线程运行在一个单一进程的上下文中,因此可以快速而方便地共享数据
无论哪种并发机制,同步对共享数据的并发访问都是一个困难的问题
提出对信号量的P和V操作就是为了帮助解决这个问题
信号量操作可以用来提供对共享数据的互斥访问,也对诸如生产者-消费者程序中共享缓冲区这样的资源访问进行调度
一个函数被称为线程安全的,当且仅当被多个并发线程反复地调用时,它会一直产生正确的结果
四类线程不安全函数:
1,不保护共享变量的函数
2,保持跨越多个调用的状态的函数
3,返回指向静态变量的指针的函数
4,调用线程不安全函数的函数
可重入函数:当它们被多个线程调用时,不会引用任何共享数据
竞争和死锁是并发程序中出现的另一些困难的问题
当程序员错误地假设逻辑流该如何调度时,就会发生竞争
当一个流等待一个永远不会发生的事件时,就会产生死锁
互斥锁加锁顺序规则:如果对于程序中每对互斥锁(s,t),每个既包含s也包含t的线程都按照相同的顺序同时对它们加锁,那么这个程序就是无死锁的