Ciao a tutti, sto studiando per l'esame di sistemi operativi e consultando i vecchi appelli non saprei come risolvere un esercizio relativo al trasferimento atomico. Potete darmi qualche delucidazione a riguardo?
Il testo dell'esercizio è il seguente:
***
Si consideri la seguente procedura di trasferimento atomico che rimuove un elemento da una coda e l’aggiunge ad un’altra. Il trasferimento deve apparire come atomico, cioe’ non ci deve essere un intervallo di tempo in cui un processo esterno possa determinare che un elemento e’ stato rimosso da una coda ma non ancora aggiunto a un’altra. La realizzazione deve essere concorrente, cioe’ deve permettere trasferimenti tra code multipli in parallelo.
void AtomicTransfer (Queue *queue1, *queue2) {
__Item thing; /* oggetto in trasferimento */
__queue1->lock.Acquire();
__thing = queue1->Dequeue();
__if (thing != NULL) {
____queue2->lock.Acquire();
____queue2->Enqueue(thing);
____queue2->lock.Release();
__}
__queue1->lock.Release();
}
Si argomenti se la procedura (i) funziona sempre, oppure (ii) non funziona mai, oppure (iii) talvolta funziona talvolta no. Per i casi (ii) o (iii) si proponga una soluzione.
***
Potete aiutarmi o darmi degli indizi sul come risolvere l'esercizio?