我在我的内核代码中使用互斥锁。在 linux/mutex.h 中,我遇到了以下问题:
#define DEFINE_MUTEX(mutexname) \
struct mutex mutexname = __MUTEX_INITIALIZER(mutexname)
extern void __mutex_init(struct mutex *lock, const char *name,
struct lock_class_key *key);
当它们似乎都初始化互斥锁以供使用时,两者之间有什么区别,或者它们完全不同并且我误解了?在我的代码中,我只是使用了 DEFINE_MUTEX
并立即开始使用它,从来没有费心去使用 __mutex_init
。如何检查我使用的锁是否正确实现? MUTEX_INITIALIZER
定义为:
#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_MUTEX
定义 和初始化 互斥锁。它对于定义全局互斥锁很有用。
mutex_init
初始化 已经分配的互斥量。当互斥量只是堆分配对象中的一个字段时,它用于每个对象的互斥量。
这些方法中的任何一种都足够来初始化互斥量。
如果你对这些方法的实现差异感到好奇(一个简单赋值,另一个需要调用非内联函数),那么原因就是 lockdep
工具。此调试工具有助于揭示不正确的锁使用情况,这可能会导致死锁。该工具需要为每个锁对象分配静态 key 。 global mutex 的关键是mutex object itself,但是heap-allocated mutex 的关键是some(internal) static variable,它是为代码中每次使用 mutex_init()
创建的。
关于linux - mutex_init 和 DEFINE_MUTEX 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33932991/