多线程以及多进程改善了系统资源的利用率并提高了系统的处理能力。然而,并发执行也带来了新的问题-死锁。
死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。
线程死锁产生的必要条件:
(1)互斥事件:一个资源每一次只能被一个进程使用。
(2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3)不可剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺。
(4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
银行家算法:
避免死锁算法总最有代表性的算法。防止死锁的机构只能确保上述四个条件之一不出现,则系统就不会发生死锁。
临界区一次只允许一个线程访问资源,而信号量允许N个线程在同一时刻访问同一资源。
1、使用CreateSemaphore()创建信号量时要指出允许的最大资源计数和当前可用资源计数。
2、一般将当前可用资源计数设置为最大值。每增加一个线程对资源的访问,可用资源计数减一,只要当前可用资源计数是大于0 的,就可发出信号。当可用计数减小到0则说明当前占用资源线程数已达到允许的最大值,不允许其他线程的进入,此时无法发出信号。
3、线程在处理完共享资源后、通过ReleaseSemaphore()函数将当前可用资源计数加1.