在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函数,相当于一个操作,它进行了两次计算就会出现稀疏检测警告信息出现后,我写了一个实验代码来测试我的判断,确实会出现一条警告信息,如果我写了两次解锁指令,就没有报警信息,但这与程序运行时不一致。
答案 0 :(得分: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,希望你的混乱会消失。
换句话说,__ second_lock用于有条件地保持锁定而不是直接使用。在释放锁之前可以检查一个特定的锁,这是迄今为止所做的。