视频地址:
http://player.bilibili.com/player.html?aid=31289365&bvid=BV1iW411d7hd&cid=222841710&page=23
课件地址:
本章对应于书中的12.1-12.3。
我们可以通过创建很多线程来完成任务的一部分,如果要求整个任务都完成才能执行下一个任务,则要求对等线程都是可结合的,主线程就能通过phread_join
来等待所有对等线程执行完毕。如果我们不需要等待整个任务都完成,此时就可以分离对等线程,让对等线程执行完毕后被自动回收。
我们之前在这里提过,如果不同进程的逻辑流在时间上是重叠的,则称它们是并发的(Concurrent),将这种现象称为并发(Concurrency)。比如进程之间通过内核完成上下文切换,使得各个进程的逻辑流在时间上是重叠的,从而使得两个进程并发执行。比如异常处理程序中,当出现异常时,会触发内核去执行异常处理程序。比如通过发送信号,可以使得在同一进程中跳转到信号处理程序中等等。
我们将使用应用级并发的应用程序称为并发程序(Concurrent Program),该类程序主要具有以下经典问题:
addjob
和deletejob
函数之间的竞争。printf
函数就可能会出现死锁现象。在主程序中执行了printf
函数,则该函数会请求某些资源的一个锁,当该printf
函数请求这个锁时它被某个信号处理程序中断了,而在信号处理程序中也要执行一个printf
函数,这个printf
也试图请求那个锁,但是由于主程序中的printf
函数持有那个锁,所以信号处理程序中的printf
得不到那个锁,所以这个printf
就在等待那个锁被释放的锁,但是主程序只有在信号处理程序返回时才可能释放那个锁,所以这里就造成了死锁。本章不会介绍上面的全部内容,只是给出一个大致的概念。目前有三种方法来构建并发程序:
接下来将介绍这三种并发编程方法,并尝试实现一个迭代echo服务器的并发版本。