У меня есть решение проблемы однополосного моста. Мне было интересно, как это решение не голодает?
Проблема в том, что автомобили, прибывающие с севера и юга, достигают однополосного моста. Автомобили, движущиеся в одном и том же направлении, могут пересекать мост одновременно, но машины, движущиеся в противоположных направлениях, не могут.
public class Bridge {
static int N = 5 ; //# of cars coming in at the same time
static int nN = 0; // # of northbound cars on bridge
static int nS = 0; // # of southbound cars on bridge
static Semaphore e = new Semaphore(1); // entry to cs
static Semaphore n = new Semaphore(1); // delay for northbound cars
static Semaphore s = new Semaphore(1); // delay for southbound cars
}
public void Northbound() {
do {
P(Bridge.n);
Bridge.nN++;
if(Bridge.nN ==1) {
P(Bridge.e);
}
V(Bridge.n);
write(i,"northbound crossing");
P(Bridge.n);
Bridge.nN--;
if(Bridge.nN ==0) {
V(Bridge.e);
}
V(Bridge.n);
try{ sleep(1000) ; } catch (InterruptedException e) { } ;
} while (true) ;
}
public void Southbound() {
do {
P(Bridge.s);
Bridge.nS++;
if(Bridge.nS ==1) {
P(Bridge.e);
}
V(Bridge.s);
read(i,"northbound crossing");
P(Bridge.s);
Bridge.nS--;
if(Bridge.nS ==0) {
V(Bridge.e);
}
V(Bridge.s);
try{ sleep(1000) ; } catch (InterruptedException e) { } ;
} while (true) ;
}
void P(Semaphore s) {
try {
s.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//increment semaphore
void V(Semaphore s) {
s.release();
}