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 "HELLO WORLD" CON DUE PROTOTHREAD.