begin process at 2012 05 27 20:56:38
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Système

 > THREAD, SEMAPHORE, ZONE CRITIQUE ET MUTEX WINDOWS

THREAD, SEMAPHORE, ZONE CRITIQUE ET MUTEX WINDOWS


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :34 846 / 941

Auteur : xian240482

Ecrire un message privé
Commentaire sur cette source (9)
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

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

FICHIER BINAIRE FREAD FWRITE
Source avec Zip OBJET CLIENT SERVEUR TCP / IP WINDOWS MILTITACHE
Source avec Zip PILE CLASS TEMPLATE OPERATOR

 Sources de la même categorie

Source avec Zip Source avec une capture INFORMATION PROCESSEUR (CPUID) par Devils_Tiger
Source avec Zip Source avec une capture LECTURE TEMPÉRATURE PROCESSEUR par Devils_Tiger
Source avec Zip Source avec une capture LECTURE FRÉQUENCE PROCESSEUR par Devils_Tiger
Source avec Zip Source avec une capture UNE LISTE HÉTÉROGÈNE DOUBLEMENT CHAINÉE par pgl10
Source avec Zip Source avec une capture POUR AFFICHER LES CARACTÈRES ACCENTUÉS SOUS WINDOWS EN MODE ... par pgl10

Commentaires et avis

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++

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

Commentaire de LordBob le 13/02/2004 18:23:17

c'est quoi un semaphore?

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.

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 ?????

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.

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

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

Commentaire de Neotuxxx le 02/07/2010 16:45:03

Même pour un simple int global les mutex sont nécessaires!
Il suffit de faire un simple test pour s'en rendre contre : par exemple en faisant deux boucle de calcul qui incrémentent un int 50000 fois chacune on ne va pas forcement tomber sur 100000 si l'on n'utilise pas de mutex. Car entre la lecture et la modification si ils sont concurrents il y a un calcul qui aura griller l'autre (en lisant la valeur ils vont tout deux prendre 85412 et au lieu de se retrouver avec 85414 on va avoir 85413!!!).

Voici le code utilisé (facile a adapté):

Mutex *mu;
int sum=0;


THR_RTYPE th1(void* param) {
for(int i=0; i<50000; i++) {
//mu->lock();
sum++;
//mu->unlock();
}
return 0;
}
THR_RTYPE th2(void* param) {
for(int i=0; i<50000; i++) {
//while( !mu->tryLock() ){}
sum++;
//mu->unlock();
}
return 0;
}

Au final le problème vient de la modification/lecture de la mémoire et non du calcul!

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,499 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales