{{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]].