Mutex互斥体的实现类似于Semaphore信号量,但在锁争用激烈的测试场景中,Mutex比信号量执行速度更快,可扩展性更好。
struct mutex {
____/* 1: unlocked, 0: locked, negative: locked, possible waiters */
____atomic_t________count;
____spinlock_t______wait_lock; /*spinlock锁,用于保护wait_list睡眠等待队列*/
____struct list_head____wait_list; /*用于管理所有在该mutex上睡眠的进程,没有成功获取锁的进程会睡眠在此链表上*/
#if defined(CONFIG_DEBUG_MUTEXES) || defined(CONFIG_MUTEX_SPIN_ON_OWNER)
____struct task_struct__*owner; /*指向锁持有者的task_struct*/
#endif
#ifdef CONFIG_MUTEX_SPIN_ON_OWNER
____struct optimistic_spin_queue osq; /* Spinner MCS lock */
#endif
#ifdef CONFIG_DEBUG_MUTEXES
____void____________*magic;
#endif
#ifdef CONFIG_DEBUG_LOCK_ALLOC
____struct lockdep_map__dep_map;
#endif
};
1、mutex的初始化
DEFINE_MUTEX(mutexname);
mutex_init(mutex);
#define __MUTEX_INITIALIZER(lockname) \ ________{ .count = ATOMIC_INIT(1) \ ________, .wait_lock = __SPIN_LOCK_UNLOCKED(lockname.wait_lock) \________, .wait_list = LIST_HEAD_INIT(lockname.wait_list) \ __________DEBUG_MUTEX_INITIALIZER(lockname) \ __________DEP_MAP_MUTEX_INITIALIZER(lockname) } #define DEFINE_MUTEX(mutexname) \ ____struct mutex mutexname = __MUTEX_INITIALIZER(mutexname) # define mutex_init(mutex) \
do {____________________________\
____static struct lock_class_key __key;_____\
____________________________\
______mutex_init((mutex), #mutex, &__key);______\
} while (0) void
__mutex_init(struct mutex *lock, const char *name, struct lock_class_key *key)
{
____atomic_set(&lock->count, 1);
____spin_lock_init(&lock->wait_lock);
____INIT_LIST_HEAD(&lock->wait_list);
____mutex_clear_owner(lock);
#ifdef CONFIG_MUTEX_SPIN_ON_OWNER
____osq_lock_init(&lock->osq);
#endif____debug_mutex_init(lock, name, key);
}