linux - mutex_init 和 DEFINE_MUTEX 之间的区别

标签 linux linux-kernel locking concurrency

我在我的内核代码中使用互斥锁。在 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/

相关文章:

c - 从用户空间获取打开文件的引用计数(inode->i_count)

c++ - 如何获取当前包含正在运行的 Windows/Linux 的磁盘号/名称?

linux - Docker 容器不会运行使用 wget 复制的 32 位 iperf 可执行文件

linux - Bash 脚本 : Read text after characters

java - 为什么 java compile 上的并行执行会及时线性增长

linux - kprobe 处理程序未针对特定功能触发

c - 如何提供一系列交错线程来表明代码中断并且没有提供完美的同步?

jquery - 如何在 jQuery 中设置一个复选框来锁定现有的滑动窗口,使其无法移动,然后通过取消选中该框来解锁它?

groovy - 如何在Jenkins Lockable Resource插件中获取锁定资源的名称

c - Linux 内核如何知道将输入事件写入哪个文件描述符?