当前位置: 代码迷 >> 综合 >> 4.4 Mutex互斥体
  详细解决方案

4.4 Mutex互斥体

热度:70   发布时间:2024-02-09 23:08:20.0

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);                                        
}

2、mutex_lock(lock)/mutex_lock_interrupt(lock)

3、void mutex_unlock(lock);

4、int mutex_trylock(lock);