Semafory

0

Witam, mam zadanie z semaforów. Szukam osoby, która umie to rozwiązać. Prosze o pomoc.

_ W systemie pracują trzy procesory P1, P2, P3 które zajmują się wykonywaniem obliczeń arytmetycznych.

Proces P1:              Proces P2:              Proces P3:
a=b+2                     b=0                         d=c+2*b
e=a/2                       c=1                        g=e%7
y=z+1                    z=e+g                      f=w+x*y
x=3*x                     w=x/2

Zakłada się, że zmienne {a,b,c,d,e,g,h,w,z,x} się we wspólnym obszarze pamięci dostępnym wszystkim procesorom. Korzystając z semaforów napisać kod procesorów P1-P3, wartości początkowe i opis semaforów tak by działania arytmetyczne na odpowiednich zmiennych zaczynały się dopiero po ich inicjalizacji. Jeszcze ma być jak najbardziej optymalne rozwiązanie.

0

Zrobiłaś coś sama, czy szukasz rozwiązania od A do Z?

0

Szukam od początku rozwiązania.

0

Co to ma wspólnego z Javą?

0

Właśnie o coś takiego mi chodzi co wysłałeś Silv, tylko nie wiem co zrobić z tymi warunkami.

0

Jak dla mnie to tutaj najbardziej pasuje użyć ReadWriteLock do chronienia operacji read/write i Condition które będzie pozwalało czekać na inicjalizację danej zmiennej bez obciążania CPU.
Zamodelowałbym sobie "zmienną" w taki sposób:

class Variable {

    private final Lock readLock;
    private final Lock writeLock;
    private final Lock initializationLock;
    private final Condition initializedCondition;

    private boolean initialized;
    private Integer value;

    Variable() {
        ReadWriteLock lock = new ReentrantReadWriteLock();
        readLock = lock.readLock();
        writeLock = lock.writeLock();
        initializationLock = new ReentrantLock();
        initializedCondition = initializationLock.newCondition();
    }

    int get() throws InterruptedException {
        initializationLock.lock();
        try {
            while (!initialized) {
                initializedCondition.await();
            }
        } finally {
            initializationLock.unlock();
        }
        readLock.lock();
        try {
            return Objects.requireNonNull(value);
        } finally {
            readLock.unlock();
        }
    }

    void set(Integer newValue) {
        Objects.requireNonNull(newValue);
        boolean signalInitialization;
        writeLock.lock();
        try {
            signalInitialization = value == null;
            value = newValue;
        } finally {
            writeLock.unlock();
        }
        if (signalInitialization) {
            initializationLock.lock();
            try {
                initialized = true;
                initializedCondition.signalAll();
            } finally {
                initializationLock.unlock();
            }
        }
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1