PDA

View Full Version : [C] Funzioni interrupt-safe


Unrue
30-09-2011, 18:16
Ciao a tutti,

qualcuno mi saprebbe spiegare perché questa funzione è thread-safe ma non interrupt-safe?


void function()
{
lock(mtx);
/* code ... */
unlock(mtx);
}

cdimauro
30-09-2011, 21:36
E' thread-safe perché la parte critica è protetta dall'accesso facendo ricorso a un lock.

Non è interrupt-safe, perché l'esecuzione della parte critica può essere interrotta in qualsiasi momento, pur avendo acquisito il lock. Ad esempio, potrebbe scatenarsi l'interrupt del timer che risveglia lo scheduler, e questi passa la CPU a un altro processo.

Per essere interrupt-safe è necessario disattivare qualunque interrupt prima di entrare nella parte critica. Se fossimo in AmigaOS, basterebbe questo:
void function()
{
Disable(ExecBase);
/* code ... */
Enable(ExecBase);
}
:cool:

Unrue
01-10-2011, 17:22
E' thread-safe perché la parte critica è protetta dall'accesso facendo ricorso a un lock.

Non è interrupt-safe, perché l'esecuzione della parte critica può essere interrotta in qualsiasi momento, pur avendo acquisito il lock. Ad esempio, potrebbe scatenarsi l'interrupt del timer che risveglia lo scheduler, e questi passa la CPU a un altro processo.

Per essere interrupt-safe è necessario disattivare qualunque interrupt prima di entrare nella parte critica. Se fossimo in AmigaOS, basterebbe questo:


Non capisco, anche se avviene un interrupt, una volta che il controllo ripassa al thread che ha acquisito il lock, non si va comunque più avanti? Perché si crea il deadlock?

cdimauro
01-10-2011, 17:28
Tu non hai parlato di dead-lock prima. :read:

E' chiaro che, avendo acquisito il lock, una volta che il controllo torna al processo / thread che era entrato nella sezione critica, tutto prosegue senza problemi. Questo perché si tratta di codice thread-safe, appunto.

Un codice interrupt-safe si aspetta che non possa essere interrotto da interrupt, appunto, magari perché sta manipolando dei registri hardware o perché deve effettuare delle operazioni che richiedono timing ben precisi.

Si tratta di due problematiche completamente diverse.

Unrue
01-10-2011, 23:52
Tu non hai parlato di dead-lock prima. :read:

E' chiaro che, avendo acquisito il lock, una volta che il controllo torna al processo / thread che era entrato nella sezione critica, tutto prosegue senza problemi. Questo perché si tratta di codice thread-safe, appunto.

Un codice interrupt-safe si aspetta che non possa essere interrotto da interrupt, appunto, magari perché sta manipolando dei registri hardware o perché deve effettuare delle operazioni che richiedono timing ben precisi.

Si tratta di due problematiche completamente diverse.

Ok,

leggendo il tuo intervento e questo link:

http://en.wikipedia.org/wiki/Reentrant_(subroutine)#Relation_to_thread_safety
ora mi è più chiaro :)