gpt4 book ai didi

multithreading - 唤醒/等待比赛锁定?

转载 作者:行者123 更新时间:2023-12-04 06:45:47 27 4
gpt4 key购买 nike

我正在阅读雷姆齐教授的OSTEP书
http://pages.cs.wisc.edu/~remzi/OSTEP/

我只能部分理解以下代码如何导致唤醒/等待竞态条件。(该代码摘自书籍一章。
http://pages.cs.wisc.edu/~remzi/OSTEP/threads-locks.pdf

void lock(lock_t *m) {
while (TestAndSet(&m->guard, 1) == 1); //acquire guard lock by spinning
if (m->flag == 0) {
m->flag = 1; // lock is acquired
m->guard = 0;
} else {
queue_add(m->q, gettid());
m->guard = 0;
park();
}
}
}

void unlock(lock_t *m) {
while (TestAndSet(&m->guard, 1) == 1); //acquire guard lock by spinning
if (queue_empty(m->q))
m->flag = 0; // let go of lock; no one wants it
else
unpark(queue_remove(m->q)); // hold lock (for next thread!)
m->guard = 0;
}

park()sys调用使调用线程进入休眠状态,unpark(threadID)用于唤醒由threadID指定的特定线程。

现在,如果线程1通过将m-> flag设置为1来持有该锁,则如果线程2进入以获取该锁,则它将失败。因此,执行else情况,并将thread2添加到队列中,但是- 假定-如果在进行park()sys调用之前,将安排线程2并为线程1分配时间片。如果线程1释放了锁定,则由于线程2在队列中,因此unlock函数会尝试调用unpark syscall(队列非空)。但是thread2并未调用park()sys调用,只是将其添加到队列中。

所以 问题
1)thread1的unpark()返回什么,只是错误提示未找到threadID?(特定于操作系统)
2)锁标志会怎样?它应该在调用锁定例程的后续线程之间传递,仅在不再有锁定争用时才释放锁定。

书中说thread2将永远为休眠。但是我的理解是,所有争夺锁的后续线程都将永远休眠,例如线程3会在以后尝试获取锁,因为在解锁调用期间,锁永远不会被线程1释放。

我的理解很可能是错误的,因为这本书非常具体地指出了thread2永远处于 sleep 状态。还是只是在示例中阅读过多而我的理解是正确的?陷入僵局了吗?

最佳答案

将此问题邮寄给了雷姆齐教授,并得到了他的答复!只需在此处发布回复即可。

雷姆齐教授的回复:

好问题!

我认为您基本上是正确的。

unpark()将返回(并且可能会说threadID没有在休眠);
在此实现中,锁保持锁定状态,线程2将永远休眠,
就像您说的那样,所有后续尝试获取锁的线程都不会
能够。

关于multithreading - 唤醒/等待比赛锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27908513/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com