首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mutex_init与DEFINE_MUTEX的区别

mutex_init与DEFINE_MUTEX的区别
EN

Stack Overflow用户
提问于 2015-11-25 23:36:50
回答 1查看 6.7K关注 0票数 1

我在内核代码中使用互斥锁。在linux/mutex.h中,我看到了以下内容:

代码语言:javascript
复制
#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被定义为:

代码语言:javascript
复制
#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) }

为了使互斥正常工作,我们是否需要两者都有?谢谢。

EN

回答 1

Stack Overflow用户

发布于 2015-11-26 11:29:56

DEFINE_MUTEX定义并初始化互斥对象。它对于定义全局互斥非常有用。

mutex_init初始化已经分配的互斥对象。当互斥对象只是堆分配对象中的一个字段时,它用于每个对象互斥对象。

任何这些方法都足以初始化互斥对象。

如果您对实现这些方法的差异感到好奇(其中一个方法具有简单的赋值,但另一个方法需要调用非内联函数),那么原因是lockdep工具。此调试工具有助于揭示不正确的锁使用情况,这可能导致死锁。该工具要求为每个锁对象分配静态键全局互斥对象的密钥是互斥对象本身的,而互斥对象的密钥是一些(内部)静态变量,它是为代码中mutex_init()的每一种用法创建的。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33932991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档