【发布时间】:2019-12-06 22:51:38
【问题描述】:
我想签入锁定在内核中的struct mutex,他是该互斥体的所有者。
struct mutex {
atomic_long_t owner;
spinlock_t wait_lock;
#ifdef CONFIG_MUTEX_SPIN_ON_OWNER
struct optimistic_spin_queue osq; /* Spinner MCS lock */
#endif
struct list_head wait_list;
#ifdef CONFIG_DEBUG_MUTEXES
void *magic;
#endif
#ifdef CONFIG_DEBUG_LOCK_ALLOC
struct lockdep_map dep_map;
#endif
};
我从kernel documentation 了解到:
字段所有者实际上包含 struct task_struct * 到当前锁 所有者,因此如果当前不拥有,则为 NULL。
是否有任何安全的方法可以将该字段与current 进行比较?
【问题讨论】:
-
注:来自kernel.org:两种锁都不是递归的
-
@red0ct 我不想实现递归锁,我想实现一些清理代码,以确保在持有互斥锁时杀死的进程释放它(即采取一些纠正措施以防万一在持有互斥锁的同时释放进程)
-
@ad3angel1s 你不能在获得互斥体时设置一个标志,在释放互斥体时清除标志,然后在清理代码中检查标志吗?
-
@IanAbbott 不确定这将如何工作。在清理过程中,我如何通过查看
isTaken标志知道当前进程是互斥锁的实际所有者? -
@ad3angel1s 这取决于您所说的“杀死”是什么意思。任务可能会收到信号,但不会在系统调用过程中被销毁。
标签: c linux-kernel mutex