{{htmlmetatags>metatag-robots=()
metatag-title=(Variabili locali | 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=(Variabili locali | Multithreading on retrocomputers)
metatag-og:description=(Come implementare il multithreading veloce ed efficiente su computer con risorse limitate.)
}}
====== Multithreading sui retrocomputer ======
===== COME GESTIRE LE VARIABILI LOCALI =====
Poiché i protothread non salvano il contesto dello stack, le variabili locali non sono conservate quando il protothread si blocca. Più correttamente, il valore di tali variabili locali non è definito.
MR_PT_THREAD(f) {
unsigned char x; // <--- valore indefinito
MR_PTI_BEGIN();
...
MR_PTI_END();
}
Questo significa che le variabili locali non possono essere utilizzate. L'alternativa è quindi quella di ricorrere o alle variabili globali oppure si deve ricorrre all'estensione del contesto del protothread.
La prima soluzione è la più semplice, ed è indicata quanto vi è un solo thread di quel tipo. In tal caso, la variabile andrà spostata dalla definizione locale per essere inclusa all'esterno della definizione del protothread:
unsigned char x;
MR_PT_THREAD(f) {
MR_PTI_BEGIN();
...
MR_PTI_END();
}
Quando i thread sono molteplici, è opportuno che ognuno di essi abbia la sua specifica copia di tale variabile locale. Questo è possibile estendendo il tipo ''mr_protothread'' con la macro ''MR_PT_CTX''. Ad esempio:
MR_PT_CTX(f, unsigned char x);
MR_PT_THREAD_EXT(f,f_protothread) {
MR_PTI_BEGIN();
...
MR_PTI_END();
}
Da notare che abbiamo dovuto utilizzare la variante ''MR_PT_THREAD_EXT'' per generare un thread che abbia un contesto esteso, definito da ''MR_PT_CTX''.
Vai a [[:it:mt6502:helloworld|"HELLO WORLD" CON DUE PROTOTHREAD]].