1、互斥体简介
将信号量的值设置为 1 就可以使用信号量
进行互斥访问
了,虽然可以通过信号量实现互斥,但是 Linux 提供了一个比信号量更专业的机制来进行互斥,它就是互斥体—mutex
。互斥访问表示一次只有一个线程可以访问共享资源,不能递归申请互斥体。在编写 Linux 驱动的时候遇到需要互斥访问的地方建议使用 mutex
。Linux 内核使用 mutex 结构体表示互斥体,定义如下(省略条件编译部分):
struct mutex {
/* 1: unlocked, 0: locked, negative: locked, possible waiters */
atomic_t count;
spinlock_t wait_lock;
};
在使用 mutex
之前要先定义一个 mutex
变量。在使用 mutex
的时候要注意如下几点:
1、
mutex可以导致休眠,因此不能在中断中使用mutex中断中只能使用自旋锁。
2、
和信号量一样,mutex保护的临界区可以调用引起阻塞的 API 函数。
3、
因为一次只有一个线程可以持有mutex,因此,必须由mutex的持有者释放
mutex。并且mutex不能递归上锁和解锁。
互斥体 API 函数
互斥体
的使用如下所示:
1 struct mutex lock; /* 定义一个互斥体 */
2 mutex_init(&lock); /* 初始化互斥体 */
3
4 mutex_lock(&lock); /* 上锁 */
5 /* 临界区 */
6 mutex_unlock(&lock); /* 解锁 */
关于 Linux 中的并发和竞争就讲解到这里,Linux 内核还有很多其他的处理并发和竞争的
机制,主要讲解了常用的原子操作、自旋锁、信号量和互斥体。