#include "Kernel.h" #include #include Thread Ping,Pong; Semaphore Aping,Apong; int echange = 0; Semaphore Sync; THREAD void pingpong() { int i, j; ThreadSolo(); printf("\n %d debute \n ", MySelf()); ThreadTutti(); for(i=0;i<100;i++) { if ( MySelf()== Ping) { SemaphoreP(Aping); for(j=0;j<=10000;j++); echange++; SemaphoreV(Apong); } else { SemaphoreP(Apong); for(j=0;j<=10000;j++); SemaphoreV(Aping); } /* for(j=0;j<10000;j++);*/ } ThreadSolo(); printf ("\n %d arrete les echanges \n", MySelf()); ThreadTutti(); } THREAD void bavard() {int j,i; j=0; for(i=0;i<100000;i++)j=j+1; ThreadSolo(); printf(" \n Bavard %d a tourne %d fois \n ", MySelf(),i); ThreadTutti(); for(i=0;i<20;i++) { for(j=0;j<10000;j++); ThreadSolo(); printf(" \n Bavard %d joue %d fois \n ", MySelf(),i); ThreadTutti(); } ThreadSolo(); printf ("\n %d arrete les echanges \n ", MySelf()); ThreadTutti(); SemaphoreV(Sync); } THREAD void ADAM() {int j,i; Sync= SemaphoreNew(0); Ping=ThreadSpawn(20000, bavard,0,"rien"); Pong=ThreadSpawn(20000,bavard,0,"rien"); ThreadSolo(); printf(" \n les bavards sont lances \n"); ThreadTutti(); for(i=0;i<10;i++) { for(j=0;j<10000;j++); ThreadSolo(); printf("\n Adam %d joue %d fois \n ", MySelf(),i); ThreadTutti(); } SemaphoreP(Sync);SemaphoreP(Sync); Aping= SemaphoreNew(0); Apong= SemaphoreNew(1); Ping=ThreadSpawn(20000,pingpong,0,"rien"); Pong=ThreadSpawn(20000,pingpong,0,"rien"); ThreadSolo(); printf("\n l'arbitre %d regarde %d et %d... \n", MySelf(),Ping, Pong); ThreadTutti(); for(;;) { for(j=0;j<10000;j++); if(echange==100) break; } ThreadSolo(); printf ( "\n c'est fini \n"); ThreadTutti(); }