Multithreading 在锁中唤醒/等待比赛?

Multithreading 在锁中唤醒/等待比赛?,multithreading,operating-system,locks,Multithreading,Operating System,Locks,我正在通读伦齐教授的OSTEP书 我只能部分理解以下代码是如何导致唤醒/等待竞争条件的。(代码摘自书籍章节)。 park()sys调用将调用线程置于睡眠状态,unpark(threadID)用于唤醒由threadID指定的特定线程 现在,如果thread1通过将m->标志设置为1来持有锁。如果thread2进来获取锁,它将失败。因此执行else案例,thread2被添加到队列中,但是-假设--if before park()进行sys调用时,thread2被调度出去,thread1被给予时间

我正在通读伦齐教授的OSTEP书

我只能部分理解以下代码是如何导致唤醒/等待竞争条件的。(代码摘自书籍章节)。

park()sys调用将调用线程置于睡眠状态,unpark(threadID)用于唤醒由threadID指定的特定线程

现在,如果thread1通过将m->标志设置为1来持有锁。如果thread2进来获取锁,它将失败。因此执行else案例,thread2被添加到队列中,但是-假设--if before park()进行sys调用时,thread2被调度出去,thread1被给予时间片。如果thread1释放锁,unlock函数尝试调用unpark syscall(队列为非空),因为thread2在队列中。但是thread2没有调用park()sys调用,它只是被添加到队列中

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

这本书说thread2将永远沉睡。但我的理解是,任何争夺锁的后续线程都将永远处于休眠状态,比如说thread3会在稍后尝试获取锁,因为在解锁调用期间,thread1永远不会释放锁


我的理解很可能是错误的,因为这本书非常具体地指出了永远沉睡的线索。或者我只是读了太多的例子,我的理解是正确的?!!!这是一个僵局吗?

把这个问题寄给了伦齐教授,并得到了他的回复!!!。只是在这里张贴回复

雷姆齐教授的答复:

好问题

我认为你基本上是对的

unpark()将返回(可能会说threadID没有休眠); 在此实现中,锁保持锁定状态,thread2将永远休眠, 正如您所说,所有试图获取锁的后续线程都不会
能够。

我认为你的理解是正确的。我认为unpark()仍将返回(但无法正常工作)。由于thread2从不休眠,thread1持有的锁将无法释放。后续线程(如thread3、…threadN)仍将添加到队列并休眠。另外,thread2已经从队列中删除,我想说它永远处于“睡眠”状态

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;
}