Pour pouvoir faire des threads, il faut deux choses : un mécanisme de changement de contexte, et un mécanisme de préemption pour interrompre un thread (sans lequel il faut que le thread redonne la main manuellement à l'ordonnanceur).
Le changement de contexte ça peut se faire en standard avec setjmp/longjmp, ou mieux avec makecontext/swapcontext sur POSIX.
Ces solutions ne sont néanmoins pas optimales, car elles vont faire des appels système pour garder une certaine cohérence avec le système de signaux Unix (pour être honnête, je ne sais pas quoi exactement).
Ça s'écrit très bien en assembleur, il suffit d'empiler tous les registres sur la pile, changer le pointeur de pile, puis dépiler les registres, puis faire un saut. Certaines architectures comme ARM ont des instructions spéciales pour ça.
Pour la préemption, les signaux Unix, par exemple alarm, peuvent être utilisés.
Partager