高级线程编程与 POSIX 线程调整
1. 优先级继承互斥锁
优先级继承是 Pthreads 中的另一种互斥锁协议。在该协议中,当一个线程锁定互斥锁时,线程的优先级通过互斥锁来控制。当另一个线程需要在该互斥锁上阻塞时,它会查看持有互斥锁的线程的优先级。如果持有互斥锁的线程优先级低于尝试在该互斥锁上阻塞的线程,持有互斥锁的线程的优先级会被提升到阻塞线程的优先级。
优先级的提升确保了持有互斥锁的线程不会被抢占,除非等待的线程也会被抢占。从某种意义上说,持有互斥锁的线程是在代表高优先级线程工作。当线程解锁互斥锁时,线程的优先级会自动降低到其正常优先级,并且优先级最高的等待线程会被唤醒。如果有更高优先级的第二个线程在互斥锁上阻塞,持有互斥锁的线程的优先级会再次提高。当互斥锁解锁时,线程仍会恢复到其原始优先级。
优先级继承协议比优先级上限更通用、更强大,但也更复杂、成本更高。如果一个库包必须使用优先级调度,并且无法避免不同优先级的线程使用互斥锁,那么优先级继承是目前唯一可用的解决方案。如果你正在编写一个主程序,并且知道库中创建的线程不会锁定你的任何互斥锁,那么优先级上限可以实现与优先级继承相同的结果,并且开销更小。
优先级继承互斥锁操作示例
| 操作 | 描述 |
|---|---|
| thread 1 locks mutex | 线程 1 锁定互斥锁 |
| thread 2 blocks waiting for mutex < |