sách gpt4 ai đã đi

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

In lại 作者:太空宇宙 更新时间:2023-11-04 04:12:14 34 4
mua khóa gpt4 Nike

在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指令,就有没有报警信息,但是与程序运行时不一致。

1 Câu trả lời

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

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/

34 4 0
太空宇宙
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com