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