#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 p1; int p2; } TD, *PTD; int main(int argc, char* argv[]) { DWORD ThreadId[5]; HANDLE hThread[5]; PTD x[5]; // 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;i<5;i++) { x[i] = (PTD) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(TD)); x[i]->p1 = i; x[i]->p2 = 2*i; hThread[i]=CreateThread(NULL,NULL,ThreadProc,(LPVOID)x[i],NULL,&ThreadId[i]); printf("calling: x[%d] -> %d\n", i, x[i]->p2); } // On attend que les 5 threads soient terminés WaitForMultipleObjects(5,hThread,TRUE,INFINITE); // On peut détruire la section critique DeleteCriticalSection(&Sync); for(int i=0;i<5;i++) { printf("Thread x[%d] Returned %d\n", i, x[i]->p2); 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(); return 0; } // Procédure utilisée par le thread DWORD WINAPI ThreadProc(LPVOID lpParam) { PTD x = (PTD)lpParam; // On entre dans une section critique EnterCriticalSection(&Sync); // Un seul thread à la fois peut avoir accès à ce code printf("Thread %d started\n", x->p1); x->p2 *= 2; printf("called: x[%d] -> %d (and hold on 100ms)\n", x->p1, x->p2); // On suspend le thread 500ms // Les autres threads sont aussi en attente car nous n'avons pas quitté la section critique Sleep(100); // Attente terminée ! 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; }