我在内核代码中使用互斥锁。在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) }为了使互斥正常工作,我们是否需要两者都有?谢谢。
发布于 2015-11-26 11:29:56
DEFINE_MUTEX定义并初始化互斥对象。它对于定义全局互斥非常有用。
mutex_init初始化已经分配的互斥对象。当互斥对象只是堆分配对象中的一个字段时,它用于每个对象互斥对象。
任何这些方法都足以初始化互斥对象。
如果您对实现这些方法的差异感到好奇(其中一个方法具有简单的赋值,但另一个方法需要调用非内联函数),那么原因是lockdep工具。此调试工具有助于揭示不正确的锁使用情况,这可能导致死锁。该工具要求为每个锁对象分配静态键。全局互斥对象的密钥是互斥对象本身的,而互斥对象的密钥是一些(内部)静态变量,它是为代码中mutex_init()的每一种用法创建的。
https://stackoverflow.com/questions/33932991
复制相似问题