linux - compiler.h 文件中有 __cond_lock(x,c) 定义,但没有 __cond_unlock(x,c) 定义?

标签 linux compilation kernel

在complier.h中有一个宏定义如下:

# define __cond_lock(x,c)   ((c) ? ({ __acquire(x); 1; }) : 0)

但是这里我有一个问题,就是哪里有__cond_lock定义,但是没有定义对应的__cond_unlock,那么这个变量就释放了,__cond_lock和__cond_unlock之间如何保持一致?

而且我检查了函数spin_trylock()的定义,它使用了__cond_lock,但是里面又使用了一个_spin_trylock函数。在_spin_trylock函数中,经过几次调用后,它会使用到__acquire函数,此时相当于一个操作,它进行了两次计算,就会导致出现Sparse检测警告信息,之后我写了一个实验来测试我的判断,确实是会出现警告信息,如果我写了两次unlock指令,就有没有报警信息,但是与程序运行时不一致。

最佳答案

使用锁定来保护关键部分取决于程序员。这意味着,如果您持有锁来保护关键原因,则必须在完成后释放锁。

Linux 内核中有多种类型的锁定原语。 spinlock()、spinlock_irq()、spin_trylock()。他们有自己的目的。现在, spin_trylock() 在其内部使用 __cond_lock ,这是因为要确定该特定锁是否可用于锁定或已被占用。看一下如何使用 spin_trylock 或 __cond_lock 的几个示例。对于前。在 kernel/sched/fair.c::rebalance_domain ( https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/kernel/sched/fair.c?id=d8dfad3876e4386666b759da3c833d62fb8b2267#n5574 ) 中查看如何使用平衡,它一直使用 spin_trylock() 来保持锁定,并在有条件地释放时执行此操作。另一个例子可以在 kernel/posix-timers.c 中找到,lock_timer() 宏。如果您仔细查看 lock_timer() 的使用,您会发现 __cond_lock 在内核中的使用方式,希望您的困惑会消失。

换句话说,__cond_lock 用于有条件地持有锁,而不是直接使用。可以在释放锁之前检查特定的锁,这就是到目前为止所做的事情。

关于linux - compiler.h 文件中有 __cond_lock(x,c) 定义,但没有 __cond_unlock(x,c) 定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18567201/

相关文章:

c# - 多线程 .NET 应用程序导致在 64 位四核 Windows Server 上运行的 KERNEL32.dll 中出现应用程序错误

linux - Shell 括号和引号

Python 脚本无法访问某些环境变量

linux - Bash 通过 FOR 重命名

java - 运行 jar 不起作用

go - 什么是 golang 中的上下文寄存器?

c - 值存储在结构中

linux - netfilter Hook 函数内存引用使我的系统崩溃

c - 静态链接 LAPACK

visual-studio - MS Visual Studio如何确定源文件已更改?