#include #include #include // prototye de la procédure utilisée pour notre 2e thread DWORD WINAPI ThreadProc(LPVOID lpParam); CRITICAL_SECTION Sync; typedef struct ThreadData { int *arr; //dyn array int p1; } TD, *PTD; int main(int argc, char* argv[]) { const int NumThreads = 5; DWORD ThreadId[NumThreads]; HANDLE hThread[NumThreads]; PTD *x = new PTD[NumThreads]; // array dynamique de structures // Avant d'utiliser une section critique, il faut l'initialiser InitializeCriticalSection(&Sync); // On démarre 5 threads et on récupère leurs HANDLES for(int i=0;ip1 = i; x[i]->arr = new int[i+1]; for (int j=0; jarr[j] = 3*i+2*j+1; // on y met quelques valeurs quelconques printf("calling: x[%d] -> %d\n", i, x[i]->arr[j]); } hThread[i]=CreateThread(NULL,NULL,ThreadProc,(LPVOID)x[i],NULL,&ThreadId[i]); } // On attend que les 5 threads soient terminés WaitForMultipleObjects(NumThreads,hThread,TRUE,INFINITE); // On peut détruire la section critique DeleteCriticalSection(&Sync); for(int i=0;i%d Returned %d\n", i, j, x[i]->arr[j]); delete [] x[i]->arr; HeapFree(GetProcessHeap(), 0, x[i]); } // Les 5 threads sont terminées, on peut quitter sans risque printf("Press any key\n"); // pressez une touche ! _getch(); delete [] x; // on nettoie les lieux avant de partir return 0; } // Procédure utilisée par le thread DWORD WINAPI ThreadProc(LPVOID lpParam) { PTD x = (PTD)lpParam; EnterCriticalSection(&Sync); // On entre dans une section critique // Un seul thread à la fois peut avoir accès à ce code printf("Thread %d started\n", x->p1); int i = x->p1; for (int j=0; jarr[j] += 1; // on bidouille un peu arr, histoire de ne pas être venu pour rien printf("called: x[%d]->[%d] +1 = %d\n", x->p1, j, x->arr[j]); } // On suspend le thread 100ms // Les autres threads sont aussi en attente car nous n'avons pas quitté la section critique printf("Hold on 100ms to justify Critical Section\n"); Sleep(100); printf("Thread %d ended\n",x->p1); // On sort de la section critique // L'attente d'un autre thread va se terminer LeaveCriticalSection(&Sync); return 0; }