0

在 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函数,这种情况下,相当于一个操作,它进行了两次计算会导致出现稀疏检测警告信息,我写了一个实验代码来测试我的判断后,确实会出现警告信息,如果我写了两次解锁指令,没有警报信息,但是这个程序运行时不一致。

4

1 回答 1

0

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

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 用于有条件地持有锁,而不是直接使用。可以在释放锁之前检查特定的锁,这是迄今为止所做的。

于 2013-09-02T08:04:44.123 回答