Я пробую это, однако вопрос: в wiki третий пункт этого алгоритма говорит:
Когда философ с вилкой получает сообщение с запросом, он сохраняет вилку, если она чистая, и отдает ее, когда она грязная. Если он отправляет вилку, он очищает вилку перед тем, как это сделать.
Я пытаюсь понять, почему это не приводит к тупику? если у одного философа есть одна чистая вилка, и он ждет, чтобы получить другую чистую вилку от соседнего закусочного/философа, который, в свою очередь, тоже ждет вилку, это может привести к тупиковой ситуации, верно? один философ всегда ждет вилки от другого?
ps: я новичок в потоках и параллелизме, воспринял это как учебный проект.
Изменить: фактическое место, где даются вилки, публикуя это, чтобы спросить, должны ли вилки быть изменчивыми или нет. pLeft, pRight — левые и правые философы, fLeft и fRight — левая и правая вилки.
private Fork giveFork(Philosopher diner) {
Fork forkToGive;
if (this.pLeft.equals(diner)) {
// give left fork to left philosopher
if (this.fLeft.isClean)
forkToGive = null; // don't give
else {
forkToGive = new Fork(this.fLeft.id, true); // give the fork
}
} else if (diner.pRight.equals(this)) {
// give right fork to right philosopher
if (this.fRight.isClean)
forkToGive = null;
else {
forkToGive = new Fork(this.fRight.id, true);
}
} else {
// default value , i'm not yet sure if this code
// can be theoretically reached
forkToGive = null;
}
return forkToGive;
}
Я не понял, где его синхронизировать, но я чувствую, что синхронизация все еще необходима. Например, когда два посетителя, скажем, первый и третий просят у второго философа вилку.
giveFork()
выполняется философом, который предоставляет форк, вам потребуется синхронизация, чтобы вернуть сгенерированный форк запрашивающей стороне (например, черезwait()/notifyAll()
). Но этот код более сложен, чем необходимо из-за создания форка. На самом деле, нет необходимости иметь выделенный классFork
, все, что вам нужно, это массивForkState forks[philosophersNr]
, и ваши стороны синхронизируются на нем. - person Victor Sorokin   schedule 11.10.2013