Linux内核同步机制与工作延迟机制详解
1. 互斥锁(Mutex)规则
互斥锁是一种重要的内核同步机制,使用时需遵循以下规则:
- 同一时间仅一个任务可持有互斥锁。
- 只有持有互斥锁的所有者能解锁。
- 不允许多次解锁。
- 不允许递归锁定。
- 必须通过API初始化互斥锁对象。
- 禁止使用 memset 或复制操作初始化互斥锁对象。
- 持有互斥锁时任务不可退出。
- 持有锁的内存区域不可释放。
- 持有中的互斥锁不可重新初始化。
- 互斥锁不可用于硬件或软件中断上下文,如小任务(tasklets)和定时器。
2. 尝试加锁方法(Try-Lock)
在某些情况下,我们希望在锁未被其他地方持有时尝试获取它,而不是让线程睡眠等待。这就是尝试加锁方法的用途。
自旋锁和互斥锁的API都提供了尝试加锁方法,分别是 spin_trylock() 和 mutex_trylock() 。这两个方法在失败(锁已被锁定)时返回0,成功(获取锁)时返回1。以下是使用示例:
// 自旋锁示例
static DEFINE_SPINLOCK(foo_lock);
static void foo(void)
{
if (!spin_trylock(&foo_lock)) {
/* Failure! the spinlock is already locked */
retu
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



