1

我目前正忙于做一些功课,想知道是否有人可以提供帮助-

我必须在java中使用信号量来同步来自2个线程的打印字母——一个打印“A”,一个打印“B”。我不能连续打印超过 2 个相同的字符,所以输出应该看起来像

啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

目前我有 3 个信号量,一个二进制互斥体设置为 1,和一个计数信号量,我的线程类看起来像这样 -

public void run() {
    while (true) {
        Time.delay(RandomGenerator.integer(0,20));
        Semaphores.mutex.down ();
        System.out.println (produce());

          if (printCount > 1)
          { printCount = 0;
                Semaphores.mutex.up ();
                Semaphores.printB.up();
          }
    } 
}
public String produce() {
    printCount++;
    return "A";
}


public void run() {
    while (true) {
        Time.delay(RandomGenerator.integer(0,20));
        Semaphores.mutex.down ();
        System.out.println (produce());

          if (printCount > 1)
          { printCount = 0;
                Semaphores.mutex.up ();
                Semaphores.printA.up();
          }
    } 
}
public String produce() {
    printCount++;
    return "B";
}

然而,无论我尝试什么,要么死锁,要么它似乎最多只能连续打印 2 个,但似乎总是不时地连续打印 3 个!

非常感谢任何帮助,如果可能的话,不要看代码或任何东西,只要几个指针:)

4

1 回答 1

2

You appear to be setting the printA and printB semaphores up without ever setting them down. If they are attempted to be set up multiple times, they would be waiting on themselves.


To answer the comment of "Where would I set them down?"

I am not quite sure, to be honest. The only thing I could imagine is if the professor is trying to exploit the fact that (in java) you can release a semaphore more times than originally acquired.

如果是这样,那么该模式将是两个信号量,一个用于生产者“B”,一个用于生产者“B”。他们的每个生产方法都将在自己的信号量上获取并在对方生产者的信号量上释放。因此,信号量计数将是生产者在没有从其他生产者相应发布的情况下获取的次数,但这种方法与信号量的概念意图不一致,取决于 Java 特定的实现,并且完全让我感到恶心。

我会尽快使用执行节流的第三个管理器或消费者线程或通过对共享整数使用互锁操作来实现这一点。无论哪种方式,不使用信号量。如果我们想确保只有三个短暂的生产者自主执行,信号量将很有用

于 2012-11-18T16:47:42.773 回答