|
|
|
Thread
a
|
Thread
b
|
... |
... |
LOAD count into register R |
LOAD count into register R |
ADD 1 to R |
SUB 1 from R |
STORE content of R in count |
STORE content of R in count |
... |
... |
Ohne Zugriffsynchronisation können die Maschinenanweisungen beider Aktivitäten miteinander verschachtelt ausgeführt werden.
Geben Sie zwei Ausführungsfolgen der Maschinenbefehle an, die dazu führen, dass der Wert von 'count' nach der Ausführung im einen Fall 21 und im zweiten Fall 19 ist.
Das nachstehende Programm in Pseudocode löst das Filosofenproblem mit Hilfe eines Monitors ohne Bedingungsvariablen, wobei wir wieder folgende Vereinbarung benutzen: left(i) = i, right(i) = (i-1) % 5
MONITOR fork
{
int avail[5] = {2, 2, 2, 2, 2 }; // each phil has access to two forks available
void pickup_fork (int phil) // admissible arguments are the integers 0, ..., 4
{
avail[left(phil)]--;
avail[right(phil)]--;
}
void putdown_fork (int phil)
{
avail[left(phil)]++:
avail[right(phil)]++;
}
}
a) Überlegen Sie sich, wie sich dieses Programm verhält und begründen Sie das Kernproblem dieser Lösung. (2 Punkte)
b) Schlagen Sie eine Änderung des Programms vor, die dieses Problem behebt, ohne Bedingungsvariablen oder Semaphore einzuführen. Beschreiben Sie, wie Ihre Lösung das in Teilaufgabe a genannte Kernproblem verhindert (7 Punkte)
Schreiben Sie ein Java-Programm, das die in den 'cobegin'-Anweisungen des Programms "processWordsConcurrently ()" aus Programm 7.1-1 angegebenen Anweisungen in eigenen Aktivitäten ausführt, so dass der gleiche Grad an Nebenläufigkeit erreicht wird.