首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实现不带信号量的锁

实现不带信号量的锁
EN

Stack Overflow用户
提问于 2012-02-09 05:21:41
回答 3查看 1.4K关注 0票数 2

我正在做一个学校项目(解释了我在问题中的限制)。我的问题是如何在NACHOS中实现没有信号量的锁。虽然玉米片的具体答案会很好,但我正在寻找的是在正确的方向上推动。到目前为止,根据我的理解,监视器使用的锁使用信号量(实际上是互斥)。最初,我们认为用监视器替换信号量来实现锁,然而,这没有意义。

EN

Stack Overflow用户

发布于 2017-04-23 01:55:53

首先检查锁的当前持有者是否是当前线程。然后使用中断开关和休眠来实现锁定。在线程从睡眠中唤醒之后,它应该再次检查锁是繁忙的还是空闲的,因为唤醒线程只会将其传递到就绪队列。在此线程可以获取锁之前,某个其他线程可能会同时再次获取锁。

代码语言:javascript
运行
复制
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);

}
票数 0
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9201621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档