Teoria współbieżności
Informatyka
Laboratorium 3: Semafory, Zamki
Semafory - definicje
- Semafor
- Operacja P() (z hol. probeer - próbować) (inaczej: opuść(), acquire()) - oznacza próbę uzyskania pozwolenia (permit) na dostęp do zasobu.
- Operacja V() (z hol. verhoog - zwiększyc) (inaczej: podnieś(), release()) - oznacza zwolnienie zasobu.
- Semafor jest inicjalizowany ilością pozwoleń.
- Semafor binarny
- Semafor, dla którego początkowa ilość pozwoleń wynosi 1.
- Uwaga: nie jest wymagane, żeby operacja release() musiała być poprzedzona operacją acquire()!
Ćwiczenie 1
- Proszę zaimplementować klasę Semaphore przy użyciu monitorów Javy (wait(), notify()) (2 pkt.).
- Proszę zaimplementować problem producentów-konsumentów z ograniczonym buforem przy użyciu semaforów (3 pkt.).
Zamki (lock)
- Zamek (lock) posiada operacje:
- lock() uzyskanie dostępu do zasobu.
- unlock() zwolnienie zasobu.
- Stosowana konstrukcja:
Lock l = ...;
l.lock();
try {
// access the resource protected by this lock
} finally {
l.unlock();
}
- Zmienna warunkowa
- Z każdym zamkiem może być związanych wiele warunków.
- Operacje: await() oraz signal() - dla odróżnienia od wait() i notify().
- Użycie:
final Lock lock = new ReentrantLock();
final Condition cond = lock.newCondition();
Ćwiczenie 2
- Proszę zaimplementować problem producentów-konsumentów z losową ilością produkowanych i konsumowanych elementów, przy użyciu bufora zabezpieczonego zamkiem i warunkami. Uwaga: proszę zwrócić uwagę na możliwość zagłodzenia "dużych" producentów przez "drobnych". (5 pkt).
Bibliografia
- Doug Lea: Concurrent Programming in Java: Design Principles and Patterns, (second edition), 1999, Addison-Wesley
- Pakiet java.util.concurrent.locks.
Maciej Malawski, malawski at agh.edu.pl
|