gpt4 book ai didi

linux - mutex_init 和 DEFINE_MUTEX 之间的区别

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:35:28 73 4
gpt4 key购买 nike

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

73 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com