{{htmlmetatags>metatag-robots=()
metatag-title=(Definire un protothread | 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=(Definire un protothread | Multithreading on retrocomputers)
metatag-og:description=(Come implementare il multithreading veloce ed efficiente su computer con risorse limitate.)
}}
====== Multithreading sui retrocomputer ======
===== COME DEFINIRE UN PROTOTHREAD =====
Il vantaggio principale dei protothread rispetto ai thread ordinari è che **sono davvero leggeri**: tutti i protothread sono eseguiti sullo stesso stack, e il cambio di contesto coincide con il riavvolgimento dello stack.
Ne consegue che definire un protothread ha la stessa complessità di definire una funzione C, a cui vanno aggiunti un "prologo" e un "epilogo". Lo si fa con le annotazioni ''MR_PT_THREAD'', seguita dalle macro ''MR_PTI_BEGIN'' e ''MR_PTI_END'':
MR_PT_THREAD(function) {
MR_PTI_BEGIN();
// ... logic ...
MR_PTI_YIELD();
// ... logic ...
MR_PTI_END();
}
L'assenza dello stack è un vantaggio nei sistemi con stringenti vincoli di memoria, quelli cioè in cui uno stack per un thread potrebbe utilizzare gran parte della memoria disponibile. Invece, con i protothreads, ciò non avviene.
Un protothread richiede solo due byte di memoria per funzionare e tale spazio viene riservato allocando almeno una variabile del tipo ''mr_protothread'':
mr_protothread functionThread;
Come è possibile notare, nella funzione viene chiamata almeno una volta la funzione ''MR_PTI_YIELD''. Tale chiamata è necessaria perché, come abbiamo anticipato, si tratta di thread cooperativi e non preventivi: cioè vi è la necessità che il programmatore indichi il punto migliore in cui l'esecuzione può essere bloccata, e da cui riprendere.
Per mandare in esecuzione i thread è sufficiente chiamare (continuamente) la funzione con la seguente sintassi:
while(1) {
function(&functionThread);
}
Da notare come sia possibile eseguire ''N'' protothread con il medesimo codice, allocando ''N'' variabili di tipo ''mr_protothread'' e richiamando, in sequenza, ognuna di esse:
mr_protothread functionThread1;
mr_protothread functionThread2;
...
mr_protothread functionThreadN;
...
while(1) {
function(&functionThread1);
function(&functionThread2);
...
function(&functionThreadN);
}
Vai a [[:it:mt6502:coordinate|COORDINARE I PROTOTHREAD]]