Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

THREAD, SEMAPHORE, ZONE CRITIQUE ET MUTEX WINDOWS


Information sur la source

Catégorie :Système Niveau : Débutant Date de création : 12/02/2004 Date de mise à jour : 12/02/2004 16:56:35 Vu / téléchargé: 23 297 / 780

Note :
10 / 10 - par 2 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

Description

C'est un code pas tres bien fait mais il a le merite d'etre explicite!
Il donne un exemple pour l'utilisation des semaphores dans la programation multitache sous windows
 

Source

  • // exemple de semaphore, zone critique et mutex
  • // par xian240482
  • #include "stdafx.h" // completement inutile mais impossible a retirer!
  • #include <windows.h>
  • #include <stdio.h>
  • // structure où l'on peu mettre tout les elements dont les threads
  • // ont besoin
  • struct s_pass
  • {
  • int numeros;
  • char chaine[20];
  • };
  • #define N 5 //nombre maximale de threads simultanés
  • // variables globales
  • int *test;
  • CRITICAL_SECTION Sync;
  • HANDLE semp,mut;
  • char texte[5000];
  • // Tache des threads
  • // Cette fonction simule un travail sur une variable texte, les
  • // sleep sont là pour alonger (point de vue temps) ce travail
  • void travail(char ajout[2])
  • { strcat(texte,"J"); Sleep(1);
  • strcat(texte,"E"); Sleep(1);
  • strcat(texte," "); Sleep(1);
  • strcat(texte,"S"); Sleep(1);
  • strcat(texte,"U"); Sleep(1);
  • strcat(texte,"I"); Sleep(1);
  • strcat(texte,"S"); Sleep(1);
  • strcat(texte," "); Sleep(1);
  • strcat(texte,"L"); Sleep(1);
  • strcat(texte,"E"); Sleep(1);
  • strcat(texte," "); Sleep(1);
  • strcat(texte,ajout); Sleep(1);
  • strcat(texte,"."); Sleep(1);
  • strcat(texte," "); Sleep(1);
  • strcat(texte,"C"); Sleep(1);
  • strcat(texte,"A"); Sleep(1);
  • strcat(texte," "); Sleep(1);
  • strcat(texte,"M"); Sleep(1);
  • strcat(texte,"A"); Sleep(1);
  • strcat(texte,"R"); Sleep(1);
  • strcat(texte,"C"); Sleep(1);
  • strcat(texte,"H"); Sleep(1);
  • strcat(texte,"E"); Sleep(1);
  • strcat(texte," "); Sleep(1);
  • strcat(texte,"E"); Sleep(1);
  • strcat(texte,"T"); Sleep(1);
  • strcat(texte," "); Sleep(1);
  • strcat(texte,"J"); Sleep(1);
  • strcat(texte,"E"); Sleep(1);
  • strcat(texte," "); Sleep(1);
  • strcat(texte,"V"); Sleep(1);
  • strcat(texte,"A"); Sleep(1);
  • strcat(texte,"I"); Sleep(1);
  • strcat(texte,"S"); Sleep(1);
  • strcat(texte," "); Sleep(1);
  • strcat(texte,"M"); Sleep(1);
  • strcat(texte,"E"); Sleep(1);
  • strcat(texte," "); Sleep(1);
  • strcat(texte,"T"); Sleep(1);
  • strcat(texte,"E"); Sleep(1);
  • strcat(texte,"R"); Sleep(1);
  • strcat(texte,"M"); Sleep(1);
  • strcat(texte,"I"); Sleep(1);
  • strcat(texte,"N"); Sleep(1);
  • strcat(texte,"E"); Sleep(1);
  • strcat(texte,"R"); Sleep(1);
  • strcat(texte," "); Sleep(1);
  • strcat(texte,"!"); Sleep(1);
  • strcat(texte,"\n");
  • }
  • // thread testant un changement de variable globale et passage de parametre
  • unsigned long WINAPI DemarrerThread_test (void * Param)
  • {
  • s_pass pass;
  • pass=*(s_pass * ) Param;
  • printf("thread %i : son message est \"%s\"\n", pass.numeros,pass.chaine);
  • *test=1;
  • return 4;
  • }
  • // thread ne faisant rien de speciale
  • unsigned long WINAPI DemarrerThread_base (void * Param)
  • {
  • s_pass pass;
  • pass=*(s_pass * ) Param;
  • printf("thread %i : son message est \"%s\"\n", pass.numeros,pass.chaine);
  • *test=1;
  • return 4;
  • }
  • // Thread executant un travail : normalement le resultat est catastrophique
  • unsigned long WINAPI DemarrerThread_travail (void * Param)
  • {
  • char temp[2];
  • s_pass pass;
  • pass=*(s_pass * ) Param;
  • printf("thread %i : son message est \"%s\"\n", pass.numeros,pass.chaine);
  • sprintf(temp,"%i",pass.numeros);
  • travail(temp);
  • return 3;
  • }
  • // thread utilisant une zone critique
  • unsigned long WINAPI DemarrerThread_zonecritique (void * Param)
  • {
  • char temp[2];
  • s_pass pass;
  • pass=*(s_pass * ) Param;
  • printf("thread %i : son message est \"%s\"\n", pass.numeros,pass.chaine);
  • sprintf(temp,"%i",pass.numeros);
  • EnterCriticalSection(&Sync);
  • travail(temp);
  • LeaveCriticalSection(&Sync);
  • return 3;
  • }
  • // theard utilisant les semaphores
  • unsigned long WINAPI DemarrerThread_semaphore (void * Param)
  • {
  • char temp[2];
  • s_pass pass;
  • pass=*(s_pass * ) Param;
  • printf("thread %i : son message est \"%s\"\n", pass.numeros,pass.chaine);
  • sprintf(temp,"%i",pass.numeros);
  • WaitForSingleObject(semp,INFINITE);
  • travail(temp);
  • ReleaseSemaphore(semp,1,NULL);
  • return 3;
  • }
  • // theard utilisant les mutex
  • unsigned long WINAPI DemarrerThread_mutex (void * Param)
  • {
  • char temp[2];
  • s_pass pass;
  • pass=*(s_pass * ) Param;
  • printf("thread %i : son message est \"%s\"\n", pass.numeros,pass.chaine);
  • sprintf(temp,"%i",pass.numeros);
  • WaitForSingleObject(mut,INFINITE);
  • travail(temp);
  • ReleaseMutex(mut);
  • return 3;
  • }
  • // le main
  • int main(int argc, char* argv[])
  • {
  • int i=0;
  • HANDLE hThread[20];
  • unsigned long ThreadId;
  • unsigned long lpExitCode;
  • s_pass pass[N];
  • for(i=0;i<N;i++)
  • { pass[i].numeros=i+1;
  • sprintf(pass[i].chaine,"le %i est passe!",i+1);
  • }
  • test= new int;
  • //on modifie une variable dans un thread, et on fait du passage de paramatre
  • *test=0;
  • printf("main: valeur de test : %i\n",*test);
  • printf("main: creation de 1 thread (CreateThread)\n");
  • hThread [0] = CreateThread(NULL,NULL,DemarrerThread_test,(void *) &pass[0], NULL, &ThreadId);
  • printf("ID1 : %i\n",ThreadId);
  • printf("main le retour de GetExitCodeThread est %i \n",GetExitCodeThread(hThread[0],&lpExitCode) );
  • printf("main: retour : %i \n" ,lpExitCode);
  • printf("main: attente de fin du 1er (WaitForSingleObject)\n");
  • WaitForSingleObject(hThread[0],INFINITE);
  • printf("main le retour de GetExitCodeThread est %i \n",GetExitCodeThread(hThread[0],&lpExitCode) );
  • printf("main: retour : %i \n" ,lpExitCode);
  • printf("main: valeur de test : %i\n",*test);
  • // on utilise la fonction terminer un thread
  • printf("\n\n\nmain: creation de 1 thread (CreateThread)\n");
  • hThread [0] = CreateThread(NULL,NULL,DemarrerThread_base,(void *) &pass[0], NULL, &ThreadId);
  • printf("ID1 : %i\n",ThreadId);
  • printf("main le retour de GetExitCodeThread est %i \n",GetExitCodeThread(hThread[0],&lpExitCode) );
  • printf("main: retour : %i \n" ,lpExitCode);
  • printf("main: arret du thread (TerminateThread)\n");
  • TerminateThread(hThread [0], 10);
  • WaitForSingleObject(hThread[0],INFINITE);
  • printf("main le retour de GetExitCodeThread est %i \n",GetExitCodeThread(hThread[0],&lpExitCode) );
  • printf("main: retour : %i \n" ,lpExitCode);
  • // on attent la fin de 2 threads
  • printf("\n\n\nmain: creation de 2 threads (CreateThread)\n");
  • hThread [0] = CreateThread(NULL,NULL,DemarrerThread_base,(void *) &pass[0], NULL, &ThreadId);
  • printf("ID1 : %i\n",ThreadId);
  • hThread [1] = CreateThread(NULL,NULL,DemarrerThread_base,(void *) &pass[1],NULL, &ThreadId);
  • printf("ID2 : %i\n",ThreadId);
  • printf("main le retour de GetExitCodeThread du premier est %i \n",GetExitCodeThread(hThread[0],&lpExitCode) );
  • printf("main: retour : %i \n" ,lpExitCode);
  • printf("main le retour de GetExitCodeThread du deuxieme est %i \n",GetExitCodeThread(hThread[1],&lpExitCode) );
  • printf("main: retour : %i \n" ,lpExitCode);
  • printf("attente des 2 theards (WaitForMultipleObjects)\n");
  • WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
  • printf("main le retour de GetExitCodeThread du premier est %i \n",GetExitCodeThread(hThread[0],&lpExitCode) );
  • printf("main: retour : %i \n" ,lpExitCode);
  • printf("main le retour de GetExitCodeThread du deuxieme est %i \n",GetExitCodeThread(hThread[1],&lpExitCode) );
  • printf("main: retour : %i \n" ,lpExitCode);
  • // on fait travailler N threads sur la meme variable (=normalement il y a un prableme d'ordre)
  • strcpy(texte,"debut :\n");
  • printf("\n\n\nmain: creation de %i threads (CreateThread) sans semaphore et sans zone critique\n",N);
  • for(i=0;i<N;i++)
  • {hThread [i] = CreateThread(NULL,NULL,DemarrerThread_travail,(void *) &pass[i], NULL, &ThreadId);
  • printf("ID%i : %i\n",i+1,ThreadId);
  • }
  • printf("attente de tout les threads (WaitForMultipleObjects)\n");
  • WaitForMultipleObjects(N, hThread, TRUE, INFINITE);
  • printf("resultat (normalement bordelique): \"%s\" \n",texte);
  • // on fait travailler N threads en utilisant une zone critique
  • strcpy(texte,"debut :\n");
  • printf("\n\n\ncreation de la szone critique(InitializeCriticalSection)\n");
  • InitializeCriticalSection(&Sync);
  • printf("main: creation de %i threads (CreateThread) avec zone critique\n",N);
  • for(i=0;i<N;i++)
  • {hThread [i] = CreateThread(NULL,NULL,DemarrerThread_zonecritique,(void *) &pass[i], NULL, &ThreadId);
  • printf("ID%i : %i\n",i+1,ThreadId);
  • }
  • printf("attente de tout les threads (WaitForMultipleObjects)\n");
  • WaitForMultipleObjects(N, hThread, TRUE, INFINITE);
  • printf("fermeture zone critique(DeleteCriticalSection)\n");
  • DeleteCriticalSection(&Sync);
  • printf("resultat : \"%s\" \n",texte);
  • // on fait travailler N theards en utilisant les semaphores
  • strcpy(texte,"debut :\n");
  • printf("\n\n\ncreation de la semaphore(CreateSemaphore)\n");
  • semp=CreateSemaphore(NULL,1,N,"truc");
  • printf("main: creation de %i threads (CreateThread) avec semaphore\n",N);
  • for(i=0;i<N;i++)
  • {hThread [i] = CreateThread(NULL,NULL,DemarrerThread_semaphore,(void *) &pass[i], NULL, &ThreadId);
  • printf("ID%i : %i\n",i+1,ThreadId);
  • }
  • printf("attente de tout les threads (WaitForMultipleObjects)\n");
  • WaitForMultipleObjects(N, hThread, TRUE, INFINITE);
  • printf("resultat : \"%s\" \n",texte);
  • printf("fermeture semaphore(CloseHandle)\n");
  • CloseHandle(semp);
  • // on fait travailler N theards en utilisant les mutex
  • strcpy(texte,"debut :\n");
  • printf("\n\n\ncreation de mutex(CreateMutex)\n");
  • mut=CreateMutex(NULL,FALSE,"mutex");
  • printf("main: creation de %i threads (CreateThread) avec mutex\n",N);
  • for(i=0;i<N;i++)
  • {hThread [i] = CreateThread(NULL,NULL,DemarrerThread_mutex,(void *) &pass[i], NULL, &ThreadId);
  • printf("ID%i : %i\n",i+1,ThreadId);
  • }
  • printf("attente de tout les threads (WaitForMultipleObjects)\n");
  • WaitForMultipleObjects(N, hThread, TRUE, INFINITE);
  • printf("resultat : \"%s\" \n",texte);
  • printf("fermeture mutex(CloseHandle)\n");
  • CloseHandle(mut);
  • // c'est la fin
  • printf("fin\n");
  • return 0;
  • }
// exemple de semaphore, zone critique et mutex
// par xian240482

#include "stdafx.h"    // completement inutile mais impossible a retirer!
#include <windows.h>
#include <stdio.h>


// structure où l'on peu mettre tout les elements dont les threads 
// ont besoin
struct s_pass
{
	int numeros;
	char chaine[20];
};

#define N 5 //nombre maximale de threads simultanés

// variables globales
int *test;
CRITICAL_SECTION Sync;
HANDLE semp,mut;
char texte[5000];

// Tache des threads
// Cette fonction simule un travail sur une variable texte, les 
// sleep sont là pour alonger (point de vue temps) ce travail
void travail(char ajout[2])
{  strcat(texte,"J"); Sleep(1);
   strcat(texte,"E"); Sleep(1);
   strcat(texte," "); Sleep(1);
   strcat(texte,"S"); Sleep(1);
   strcat(texte,"U"); Sleep(1);
   strcat(texte,"I"); Sleep(1);
   strcat(texte,"S"); Sleep(1);
   strcat(texte," "); Sleep(1);
   strcat(texte,"L"); Sleep(1);
   strcat(texte,"E"); Sleep(1);
   strcat(texte," "); Sleep(1);
   strcat(texte,ajout); Sleep(1);
   strcat(texte,"."); Sleep(1);
   strcat(texte," "); Sleep(1);
   strcat(texte,"C"); Sleep(1);
   strcat(texte,"A"); Sleep(1);
   strcat(texte," "); Sleep(1);
   strcat(texte,"M"); Sleep(1);
   strcat(texte,"A"); Sleep(1);
   strcat(texte,"R"); Sleep(1);
   strcat(texte,"C"); Sleep(1);
   strcat(texte,"H"); Sleep(1);
   strcat(texte,"E"); Sleep(1);
   strcat(texte," "); Sleep(1);
   strcat(texte,"E"); Sleep(1);
   strcat(texte,"T"); Sleep(1);
   strcat(texte," "); Sleep(1);
   strcat(texte,"J"); Sleep(1);
   strcat(texte,"E"); Sleep(1);
   strcat(texte," "); Sleep(1);
   strcat(texte,"V"); Sleep(1);
   strcat(texte,"A"); Sleep(1);
   strcat(texte,"I"); Sleep(1);
   strcat(texte,"S"); Sleep(1);
   strcat(texte," "); Sleep(1);
   strcat(texte,"M"); Sleep(1);
   strcat(texte,"E"); Sleep(1);
   strcat(texte," "); Sleep(1);
   strcat(texte,"T"); Sleep(1);
   strcat(texte,"E"); Sleep(1);
   strcat(texte,"R"); Sleep(1);
   strcat(texte,"M"); Sleep(1);
   strcat(texte,"I"); Sleep(1);
   strcat(texte,"N"); Sleep(1);
   strcat(texte,"E"); Sleep(1);
   strcat(texte,"R"); Sleep(1);
   strcat(texte," "); Sleep(1);
   strcat(texte,"!"); Sleep(1);
   strcat(texte,"\n");
}

// thread testant un changement de variable globale et passage de parametre
unsigned long WINAPI DemarrerThread_test (void * Param)
{
	s_pass pass;
	pass=*(s_pass * ) Param;
	printf("thread %i : son message est \"%s\"\n", pass.numeros,pass.chaine);
	*test=1;
	return 4;
}


// thread ne faisant rien de speciale
unsigned long WINAPI DemarrerThread_base (void * Param)
{
	s_pass pass;
	pass=*(s_pass * ) Param;
	printf("thread %i : son message est \"%s\"\n", pass.numeros,pass.chaine);
    *test=1;
	return 4;
}




// Thread executant un travail : normalement le resultat est catastrophique
unsigned long WINAPI DemarrerThread_travail (void * Param)
{
    char temp[2];
   	s_pass pass;
	pass=*(s_pass * ) Param;
	printf("thread %i : son message est \"%s\"\n", pass.numeros,pass.chaine);
    sprintf(temp,"%i",pass.numeros);
    travail(temp);
    return 3;
}

// thread utilisant une zone critique
unsigned long WINAPI DemarrerThread_zonecritique (void * Param)
{
    char temp[2];
   	s_pass pass;
	pass=*(s_pass * ) Param;
	printf("thread %i : son message est \"%s\"\n", pass.numeros,pass.chaine);
    sprintf(temp,"%i",pass.numeros);
    EnterCriticalSection(&Sync);
    travail(temp);
    LeaveCriticalSection(&Sync);
    return 3;
}

// theard utilisant les semaphores
unsigned long WINAPI DemarrerThread_semaphore (void * Param)
{
    char temp[2];
   	s_pass pass;
	pass=*(s_pass * ) Param;
	printf("thread %i : son message est \"%s\"\n", pass.numeros,pass.chaine);
    sprintf(temp,"%i",pass.numeros);
    WaitForSingleObject(semp,INFINITE);
    travail(temp);
    ReleaseSemaphore(semp,1,NULL);
    return 3;
}

// theard utilisant les mutex
unsigned long WINAPI DemarrerThread_mutex (void * Param)
{
    char temp[2];
   	s_pass pass;
	pass=*(s_pass * ) Param;
	printf("thread %i : son message est \"%s\"\n", pass.numeros,pass.chaine);
    sprintf(temp,"%i",pass.numeros);
    WaitForSingleObject(mut,INFINITE);
    travail(temp);
	ReleaseMutex(mut);
    return 3;
}




// le main
int main(int argc, char* argv[])
{
	int i=0;
	HANDLE hThread[20];
	unsigned long ThreadId;
	unsigned long lpExitCode;
	s_pass pass[N];

	for(i=0;i<N;i++)
	{	pass[i].numeros=i+1;
		sprintf(pass[i].chaine,"le %i est passe!",i+1);
	}
	test= new int;

	//on modifie une variable dans un thread, et on fait du passage de paramatre
	*test=0;
	printf("main: valeur de test : %i\n",*test);
	printf("main: creation de 1 thread (CreateThread)\n");
	hThread [0] = CreateThread(NULL,NULL,DemarrerThread_test,(void *) &pass[0], NULL, &ThreadId);
	printf("ID1 : %i\n",ThreadId);
    printf("main le retour de GetExitCodeThread est %i \n",GetExitCodeThread(hThread[0],&lpExitCode) );
	printf("main: retour : %i \n" ,lpExitCode);
	printf("main: attente de fin du 1er (WaitForSingleObject)\n");
	WaitForSingleObject(hThread[0],INFINITE);
    printf("main le retour de GetExitCodeThread est %i \n",GetExitCodeThread(hThread[0],&lpExitCode) );
	printf("main: retour : %i \n" ,lpExitCode);
	printf("main: valeur de test : %i\n",*test);

	// on utilise la fonction terminer un thread
	printf("\n\n\nmain: creation de 1 thread (CreateThread)\n");
	hThread [0] = CreateThread(NULL,NULL,DemarrerThread_base,(void *) &pass[0], NULL, &ThreadId);
	printf("ID1 : %i\n",ThreadId);
    printf("main le retour de GetExitCodeThread est %i \n",GetExitCodeThread(hThread[0],&lpExitCode) );
	printf("main: retour : %i \n" ,lpExitCode);
	printf("main: arret du thread (TerminateThread)\n");
    TerminateThread(hThread [0], 10);
	WaitForSingleObject(hThread[0],INFINITE);
    printf("main le retour de GetExitCodeThread est %i \n",GetExitCodeThread(hThread[0],&lpExitCode) );
	printf("main: retour : %i \n" ,lpExitCode);


	// on attent la fin de 2 threads
	printf("\n\n\nmain: creation de 2 threads (CreateThread)\n");
	hThread [0] = CreateThread(NULL,NULL,DemarrerThread_base,(void *) &pass[0], NULL, &ThreadId);
	printf("ID1 : %i\n",ThreadId);
	hThread [1] = CreateThread(NULL,NULL,DemarrerThread_base,(void *) &pass[1],NULL, &ThreadId);
	printf("ID2 : %i\n",ThreadId);
	printf("main le retour de GetExitCodeThread du premier est %i \n",GetExitCodeThread(hThread[0],&lpExitCode) );
	printf("main: retour : %i \n" ,lpExitCode);
	printf("main le retour de GetExitCodeThread du deuxieme est %i \n",GetExitCodeThread(hThread[1],&lpExitCode) );
	printf("main: retour : %i \n" ,lpExitCode);
	printf("attente des 2 theards (WaitForMultipleObjects)\n");
	WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
	printf("main le retour de GetExitCodeThread du premier est %i \n",GetExitCodeThread(hThread[0],&lpExitCode) );
	printf("main: retour : %i \n" ,lpExitCode);
	printf("main le retour de GetExitCodeThread du deuxieme est %i \n",GetExitCodeThread(hThread[1],&lpExitCode) );
	printf("main: retour : %i \n" ,lpExitCode);

	// on fait travailler N threads sur la meme variable (=normalement il y a un prableme d'ordre)
	strcpy(texte,"debut :\n");
	printf("\n\n\nmain: creation de %i threads (CreateThread) sans semaphore et sans zone critique\n",N);
    for(i=0;i<N;i++)
	{hThread [i] = CreateThread(NULL,NULL,DemarrerThread_travail,(void *) &pass[i], NULL, &ThreadId);
	 printf("ID%i : %i\n",i+1,ThreadId);
	}

	printf("attente de tout les threads (WaitForMultipleObjects)\n");
	WaitForMultipleObjects(N, hThread, TRUE, INFINITE);
	printf("resultat (normalement bordelique): \"%s\" \n",texte);


	// on fait travailler N threads en utilisant une zone critique
	strcpy(texte,"debut :\n");
	printf("\n\n\ncreation de la szone critique(InitializeCriticalSection)\n");
    InitializeCriticalSection(&Sync);
    printf("main: creation de %i threads (CreateThread) avec zone critique\n",N);
    for(i=0;i<N;i++)
	{hThread [i] = CreateThread(NULL,NULL,DemarrerThread_zonecritique,(void *) &pass[i], NULL, &ThreadId);
	 printf("ID%i : %i\n",i+1,ThreadId);
	}
	printf("attente de tout les threads (WaitForMultipleObjects)\n");
	WaitForMultipleObjects(N, hThread, TRUE, INFINITE);
	printf("fermeture zone critique(DeleteCriticalSection)\n");
	DeleteCriticalSection(&Sync);
	printf("resultat : \"%s\" \n",texte);



	// on fait travailler N theards en utilisant les semaphores
	strcpy(texte,"debut :\n");
	printf("\n\n\ncreation de la semaphore(CreateSemaphore)\n");	
    semp=CreateSemaphore(NULL,1,N,"truc");
	printf("main: creation de %i threads (CreateThread) avec semaphore\n",N);
    for(i=0;i<N;i++)
	{hThread [i] = CreateThread(NULL,NULL,DemarrerThread_semaphore,(void *) &pass[i], NULL, &ThreadId);
	 printf("ID%i : %i\n",i+1,ThreadId);
	}
	printf("attente de tout les threads (WaitForMultipleObjects)\n");
	WaitForMultipleObjects(N, hThread, TRUE, INFINITE);
	printf("resultat : \"%s\" \n",texte);
	printf("fermeture semaphore(CloseHandle)\n");
    CloseHandle(semp);

	// on fait travailler N theards en utilisant les mutex
	strcpy(texte,"debut :\n");
	printf("\n\n\ncreation de mutex(CreateMutex)\n");	
	mut=CreateMutex(NULL,FALSE,"mutex");
	printf("main: creation de %i threads (CreateThread) avec mutex\n",N);
    for(i=0;i<N;i++)
	{hThread [i] = CreateThread(NULL,NULL,DemarrerThread_mutex,(void *) &pass[i], NULL, &ThreadId);
	 printf("ID%i : %i\n",i+1,ThreadId);
	}
	printf("attente de tout les threads (WaitForMultipleObjects)\n");
	WaitForMultipleObjects(N, hThread, TRUE, INFINITE);
	printf("resultat : \"%s\" \n",texte);
	printf("fermeture mutex(CloseHandle)\n");
    CloseHandle(mut);

	// c'est la fin
	printf("fin\n");

	return 0;
}


Conclusion

Vu que je n'avais pas trouvé d'exemple de ce genre sur le site, en voila un! j'espere qu'il vous aidera.
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de Arnotic le 12/02/2004 21:19:13 administrateur CS

Bonjour,

   Concernant stdafx.h tu peux le supprimer en créer un projet vide au départ. Et non pas en se servant du code de base fourni par VC. Choisi empty de cette manière du n'aura pas besoin de stdafx.h

Arnotic
Admin CS, MVP Visual C++

signaler à un administrateur
Commentaire de vecchio56 le 12/02/2004 21:24:45 administrateur CS

note quand même que quand tu utilises les en tetes précompilés, ton projet se compile bien plus vite, et c'est très interessant pour les gros projets, ce n'est évidemment pas le cas ici

signaler à un administrateur
Commentaire de LordBob le 13/02/2004 18:23:17

c'est quoi un semaphore?

signaler à un administrateur
Commentaire de ymca2003 le 14/02/2004 12:09:10

c'est un objet qui permet de limiter l'accès à resource partagée par plusieurs thread :

A semaphore object is a synchronization object that maintains a count between zero and a specified maximum value. The count is decremented each time a thread completes a wait for the semaphore object and incremented each time a thread releases the semaphore. When the count reaches zero, no more threads can successfully wait for the semaphore object state to become signaled. The state of a semaphore is set to signaled when its count is greater than zero, and nonsignaled when its count is zero.

The semaphore object is useful in controlling a shared resource that can support a limited number of users. It acts as a gate that limits the number of threads sharing the resource to a specified maximum number. For example, an application might place a limit on the number of windows that it creates. It uses a semaphore with a maximum count equal to the window limit, decrementing the count whenever a window is created and incrementing it whenever a window is closed. The application specifies the semaphore object in call to one of the wait functions before each window is created. When the count is zero Y indicating that the window limit has been reached Y the wait function blocks execution of the window-creation code.

signaler à un administrateur
Commentaire de yAAm le 05/03/2004 11:11:33

Les mutex sont des objet permettant de synchroniser les threads, par exemple pour laisser un acces exclusif a chaque tread qui en est proprietaire ainsi que de booster la priorité de celui-ci et ... si j'ai bien compris, mais alors quelle est la difference avec une semaphore ?????

signaler à un administrateur
Commentaire de xian240482 le 09/03/2004 11:29:16

La difference entre les semaphores et les mutex? aucune!
Les mutex comme les zones critique sont des cas particulier des semaphores. Ils sont plus facile a utilisé c'est tout.

signaler à un administrateur
Commentaire de lastpixl le 02/04/2004 21:44:12

Les sémaphores ont un counter, pas les mutex.
Un mutex peut être propriété d'un thread ou libre. Un sémaphore est un mutex qui peut être possédé par x personnes à la fois, on choisit x a la creation.

+++,
Lastpix'l

signaler à un administrateur
Commentaire de shuttleur le 12/08/2008 12:28:07

Salut à tous

Je comprends tout à fait la nécessité d'utiliser des mutex dans le cas d'un accès concurrent à un tableau par exemple, mais est ce utile si la ressource est un simple entier ?

Y'a t'il un risque de corruption de la ressource lorsqu'elle a une taille élémentaire ?

Merci d'avance

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,156 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.