我目前正在研究锁,我对以下使用锁保护代码关键部分的示例感到困惑。
这是我的问题:
如果 Deposit 函数首先获取锁,这是否意味着 Remove 函数必须等待 Deposit 函数释放锁才能执行其他操作?换句话说,Remove 会卡在 lock->acquire 直到 Deposit 函数锁定->release 吗?
最佳答案
请注意,您有多个参与者:lock,在其上调用 lock
操作,以及条件变量(名为 notEmpty
和 notFull
),等待
。
因为问题是关于锁的,所以回答是 - yes。
remove
将进入函数或从等待状态中唤醒并尝试获取锁。
无论如何,如果 deposit
函数正在使用它(也就是说,它有一个锁,它已经获得了它),remove
函数将卡在那个锁上,直到它被释放(或者,更好的是,release
d)。
另请注意,当您等待
条件变量 时,锁会自动释放并在您醒来后重新获取。因此,函数不会永远持有锁,仅此而已。
关于c - "locks"在保护临界区的程序中是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35425453/