2

一道考试题:

一个资源在 N 个线程之间共享,因此访问是基于先到先得的原则。解释您将如何实施先到先得的政策。

我的回答是(注意:该课程是基于 Java 的):

使用信号量(二进制)来控制对共享资源的访问。然后创建一个馈线类/线程来访问信号量。馈线线程使用先进先出队列来实现先到先得。当信号量空闲时,它允许队列头部的线程访问共享资源。

我刚刚在纸上记下了上述方法,它似乎有效。

这个问题在一个 20 分的问题中值 8 分,所以我怀疑使用new ReentrantLock(true)是否足以获得满分。

你们有什么感想?

4

1 回答 1

0

您的回答确实没有解决问题。这不仅与锁定有关,而且还与等待资源的线程排队有关。

  • 你如何排队等待资源的线程?
  • 如果有线程在等待资源,你如何唤醒它们以便它们按顺序消耗资源。
  • 如果有线程在等待资源,您如何确保它们按顺序运行并避免围绕新线程抢占它的竞争条件。

可能的解决方案类似于以下代码:

  lockResource(resource);
  try {
     ... consume the resource
  } finally {
     unlockResource(resource);
  }

lockResource会做类似的事情:

  1. 获取资源上的锁。
  2. long accessNum检索与包含 a和 a的资源关联的锁对象long runningNum
  3. 增加accessNum值并存储线程的结果。
  4. 检查long runningNum值以查看是否 == 到 my accessNum.
  5. 如果是 == 我的,解锁资源并继续运行。
  6. 如果队列中的人数超过我,则wait()在资源上。

unlockResource(...)被调用时,线程应该:

  1. 锁定资源。
  2. running++
  3. 称呼notifyAll()
  4. 解锁资源

如果线程正在等待并被唤醒:

  1. 检查是否accessNum == runningNum.
  2. 如果为真,则解锁资源并继续运行
  3. 如果没有,则返回wait()
于 2012-10-10T13:49:16.630 回答