{{htmlmetatags>metatag-robots=()
metatag-title=(Funzioni bloccanti e non | Multithreading on retrocomputers)
metatag-keywords=(Multithreading,Commodore 64,Commodore VIC20,Atari,Commodore128,MIDRES Library,6502,6510)
metatag-description=(Come implementare il multithreading veloce ed efficiente su computer con risorse limitate.)
metatag-media-og:image=(:mt6502.png)
metatag-og:title=(Funzioni bloccanti e non | Multithreading on retrocomputers)
metatag-og:description=(Come implementare il multithreading veloce ed efficiente su computer con risorse limitate.)
}}
====== Multithreading sui retrocomputer ======
===== FUNZIONI BLOCCANTI E NON BLOCCANTI =====
Un protothread viene eseguito all'interno di una singola funzione C e non può estendersi su altre funzioni. Può, ovviamente, chiamare normali funzioni C ma, al tempo stesso, non può "bloccarsi" all'interno di una funzione chiamata.
Questo codice, quindi, non potrà mai né eseguirsi né tanto meno compilarsi correttamente:
void f( ) {
...
MR_PTI_YIELD();
...
}
MR_PT_THREAD(g) {
...
f();
...
}
Questo perché il protothread ''g()'' cercherà di bloccare l'esecuzione quando si trova nella funzione ''f()'', che a sua volta non è un protothread. Per superare questo limite **può essere generato un protothread separato per ciascuna funzione potenzialmente bloccante** e allocata, di conseguenza, una variabile ''mr_protothread'' a lui dedicata.
MR_PT_THREAD(f) {
...
MR_PTI_YIELD();
...
}
mr_protothread fThread;
MR_PT_THREAD(g) {
...
MR_PTI_SPAWN(&fThread, f(&fThread));
...
}
Il vantaggio di questo approccio è che il blocco è esplicito, e quindi **il programmatore sa esattamente quali funzioni possono bloccare** quelle non possono bloccare, semplificando quindi il debugging.
Vai a [[:it:mt6502:locals|COME GESTIRE LE VARIABILI LOCALI]].