我正在做一个学校项目(解释了我在问题中的限制)。我的问题是如何在NACHOS中实现没有信号量的锁。虽然玉米片的具体答案会很好,但我正在寻找的是在正确的方向上推动。到目前为止,根据我的理解,监视器使用的锁使用信号量(实际上是互斥)。最初,我们认为用监视器替换信号量来实现锁,然而,这没有意义。
发布于 2017-04-23 01:55:53
首先检查锁的当前持有者是否是当前线程。然后使用中断开关和休眠来实现锁定。在线程从睡眠中唤醒之后,它应该再次检查锁是繁忙的还是空闲的,因为唤醒线程只会将其传递到就绪队列。在此线程可以获取锁之前,某个其他线程可能会同时再次获取锁。
void Lock::Acquire() {
ASSERT(!isHeldByCurrentThread()); // cannot acquire a lock twice
IntStatus oldLevel = interrupt->SetLevel(IntOff); // disable interrupts
while (freeOrBusy == 'b') {
queue->Append((void *)currentThread);
currentThread->Sleep();
}
freeOrBusy = 'b';
currentHolder = currentThread;
(void) interrupt->SetLevel(oldLevel); // re-enable interrupts
}
void Lock::Release() {
ASSERT(isHeldByCurrentThread());
IntStatus oldLevel = interrupt->SetLevel(IntOff);
freeOrBusy = 'f';
currentHolder = NULL;
Thread *thread = (Thread *)queue->Remove(); // "queue" is the list of threads waiting
if (thread != NULL) // make thread ready
scheduler->ReadyToRun(thread);
(void) interrupt->SetLevel(oldLevel);
}https://stackoverflow.com/questions/9201621
复制相似问题