Как это решение проблемы моста с одним переулком не голодает? - PullRequest
2 голосов
/ 10 апреля 2020

У меня есть решение проблемы однополосного моста. Мне было интересно, как это решение не голодает?

Проблема в том, что автомобили, прибывающие с севера и юга, достигают однополосного моста. Автомобили, движущиеся в одном и том же направлении, могут пересекать мост одновременно, но машины, движущиеся в противоположных направлениях, не могут.

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();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...