基于 Pthreads 的多线程编程 II - 同步
在多线程编程中,同步是一个至关重要的话题。本文将深入探讨使用互斥锁(mutex)进行线程同步的相关内容,包括优先级反转问题、看门狗定时器、优先级继承以及互斥锁的其他变体。
1. 进程间通信与互斥锁
在进行进程间通信(IPC)时,建议优先使用专门为此设计的 IPC 机制。虽然可以使用进程共享的互斥锁作为两个或多个进程的线程之间的同步机制,但需要仔细考虑是否真的有必要。
使用互斥锁相对于传统的(二进制)信号量对象有一些优势:
- 互斥锁总是与一个所有者线程相关联,只有所有者才能对其进行操作,从而避免一些非法或有缺陷的情况。
- 互斥锁可以设置为使用嵌套(递归)锁定,并能有效处理优先级反转问题(通过继承协议和/或优先级上限属性)。
2. 优先级反转、看门狗定时器与火星探测器事件
在实时操作系统(RTOS)中,通常会运行对时间要求严格的多线程应用程序。RTOS 调度器决定下一个运行线程的主要规则是:具有最高优先级的可运行线程将被调度运行。
2.1 优先级反转示例
假设有一个包含三个线程的应用程序:
| 线程 | 优先级 |
| ---- | ---- |
| 线程 A | 90(高优先级) |
| 线程 B | 10(低优先级) |
| 线程 C | 45(中优先级) |
存在一个共享资源 X,线程 A 和线程 B 都需要访问它,因此需要使用互斥锁来同步对该资源的访问。
正常情况下,线程 B 先获取互斥锁,线程 A 随后请求锁时会等待线程