Должны ли семафоры принадлежать критической области или запущенному потоку? - PullRequest
0 голосов
/ 24 марта 2019

Скажите, что я реализую модель производитель-потребитель. Производитель и потребитель совместно используют буфер, который является критическим регионом. Производитель хочет выполнить запись в буфер, а потребитель - из него.

Для простоты в этом примере используется двоичный семафор, в котором только один поток может одновременно обращаться к буферу. Типично ли, чтобы семафор был частью класса производитель / потребитель, или они должны быть частью класса буфера?

// Producer class 
class Producer implements Runnable { 
  Buffer buffer;

  ... more code
} 

// Buffer class
class Buffer {
  Deque<Integer> buffer;
  private final Semaphore producerSemaphore;
  private final Semaphore consumerSemaphore;

  ... more code
}

против

// Producer class 
class Producer implements Runnable { 
  Buffer buffer;
  private final Semaphore producerSemaphore;

  ... more code
} 

// Buffer class
class Buffer {
  Deque<Integer> buffer;

  ... more code
}
...