首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有信号量和加权优先级的读写器

具有信号量和加权优先级的读写器
EN

Stack Overflow用户
提问于 2014-05-01 05:08:59
回答 1查看 624关注 0票数 0

我想知道是否有一个简单的解决读者作者问题的方法,在这个问题上,我们可以赋予读者优先权,而不是使用信号量的绝对优先级。基本上,我希望在关键部分的队列中实现5名读者对1名作家的比例。

换句话说,如果一个读者和一个作家想要进入关键部分,读者将有优先权。如果另一位读者想在这之后进入,他们也有优先权。这将继续对五个读者,然后作者将优先考虑。

例如,想象一下,如果10名读者和2名作家想要进入关键部分。进入顺序为:

  1. 5位读者
  2. 1名作家
  3. 5位读者
  4. 1名作家

我希望能在这件事上提供任何帮助。

EN

回答 1

Stack Overflow用户

发布于 2014-05-14 03:06:38

两天前,我刚刚参加了一个设计会议,我们打算解决同样的问题。这是我们想出来的。

代码语言:javascript
运行
复制
class WeightedSemaphore {

  Map<String,Semaphore> layer1
  Semaphore layer2

  //ratios passed, for your example:  read:5, write:1
  public configure(int realLeases, Map<String,Integer> ratios) {
     for (String key : ratio.keys) {
        layer1.put(key, new Semaphore(realLeases * ratios.get(key))
     }
     layer2 = new Semaphore(realLeases, fair)
  }

  public acquire(String key) {
     layer1.get(key).acquire();
     layer2.acquire();
  }

}

这是极小的伪码,但主要通过。其主要想法是设计一个2层信号量,其中layer2是一个单一的信号量,具有我们想要支持的实际数量的租约;而layer1帮助塑造了等待layer2信号量的工作组合。

这种方法有两个特性,我认为它们很酷。

  1. 虽然它支持具有更高比率的密钥,但它不会表现出在许多优先级队列类型系统中看到的饥饿行为。
  2. 当没有高度优先的工作可做时,它不会浪费能力。任何键都可以使用信号量的全部容量,但是当新的工作到来时,它会迅速地让位。

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23402347

复制
相关文章

相似问题

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