【发布时间】:2020-07-02 05:14:24
【问题描述】:
在this video 中,有一个用于解决生产者-消费者问题的信号量伪代码。生产者将项目放入队列,消费者从队列中取出。代码如下所示:
拥有锁的线程即将唤醒一个线程:
// producer
lock.acquire() // 1
...
dataready.wakeOneThread() // 2
...
lock.release(); // 3
即将被唤醒的线程:
// consumer
lock.acquire() // 1
...
while (queue.isEmpty()) { // <------ program continues from here
dataready.wait(lock); // 2
}
...
lock.release(); // 3
函数wakeOneThread 释放锁,将一个线程放入就绪队列,再次获取锁,在line 3 上释放锁(我可能错了)。将一个线程放入就绪队列后,如果线程在producer 仍在获取锁时被唤醒,则该线程(consumer)应该等到锁被释放(至少他们是这么说的,它一直等到锁被释放)。
我的问题是:
1 - 这是如何工作的?
线程会醒来,发现队列不为空,继续,命中line 3,等到锁空闲,获取,然后释放。
是否正忙于等待释放锁?如果不是,那么,既然没有人会再次唤醒它,它怎么知道锁被释放了?
我不确定是不是这样,因为忙等待效率不高......
2 - 假设它正忙于等待,第二个问题,consumer 将继续并修改值,就好像它有锁一样。我相信锁应该在它开始运行的那一刻被获取......
我不确定是否是这种情况(线程在启动时获取锁),因为代码中没有任何迹象表明会发生这种情况。
当生产者命中line 3(consumer被唤醒后,就像拥有锁一样),锁将再次释放,另一个线程将能够获取锁,因此两个线程认为他们都拥有锁......
【问题讨论】:
标签: multithreading synchronization locking semaphore