Реализация параллельной очереди - PullRequest
0 голосов
/ 13 сентября 2018

Реализовать параллельную очередь так, чтобы бесконечные потоки могли выполнять операцию peek(), но только один может poll() и offer() в определенное время.Кроме того, если поток хочет poll() пустую очередь, он должен подождать, пока в очереди появится элемент, а затем выполнить poll().

class ConcurrentQ{
  Semaphore mutex = new Semaphore(1, true); 
  Semaphore db = new Semaphore(1, true);  
  Semaphore full = new Semaphore(0, true);
  Queue<Integer> list = new LinkedList<>();
  volatile int peekers = 0;

  public void push(int x){
    db.acquire(); 
    list.push(x);
    full.release();
    db.release();
  }

  //Must look at empty case
  public int pop(){
    full.acquire();
    db.acquire();
    int x = list.pop();
    db.release();
    return x;
  }

  public int peek(){
    mutex.acquire();
      if(peekers == 0){
        db.acquire();
      }
      ++peekers;
    mutex.release();

    int val = list.front();

    mutex.acquire();
      if(peekers == 1){
        db.release();
      }
      --peekers;
    mutex.release();
    return val;
  }
}

Это мойреализации, и я чувствую, что это по большей части правильно ( Может кто-нибудь помочь мне проверить это? ).Я запутался в конкретном методе pop().Правильно ли использовать семафор full?

...