Thread, mutex et variable partagée [Résolu]

bloobird0 30 Messages postés vendredi 6 février 2004Date d'inscription 23 octobre 2008 Dernière intervention - 25 janv. 2005 à 17:54 - Dernière réponse : bloobird0 30 Messages postés vendredi 6 février 2004Date d'inscription 23 octobre 2008 Dernière intervention
- 25 janv. 2005 à 18:37
hello all,

je suis en train d'expérimenter pour la première fois les threads en C sous Windows et je voudrais confirmation ou remarques sur ce qui suit:

J'ai 1 variable globale utilisée entre 2 threads pour que, en gros, le premier puisse envoyer des commandes à l'autre.

Résumé: un thread écrit dans cette variable et l'autre la lit.

- le 1er thread fait appel à CreateMutex à la ligne juste au dessus de celle qui modifie la variable et un ReleaseMutex à celle juste au dessous
- le 2e thread fait appel à un WaitForSingleObject juste avant de lire la variable.

Les questions que je me posent sont:
- est ce que dans le 2eme thread je dois faire un CreateMutex avant de lire cette variable et un ReleaseMutex juste après?
- est-ce indispensable d'utiliser les mutex et WaitForSingleObject si la variable n'est modifiée que par un seul thread (sachant que chaque thread est un boucle qui revient régulièrement au même endroit et les commandes peuvent attendre quelques boucles sans problême)?

Merci d'avance pour vos remarques et partage d'expérience.
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
bayeto 224 Messages postés mardi 12 août 2003Date d'inscription 18 octobre 2010 Dernière intervention - 25 janv. 2005 à 18:04
3
Merci
Les mutexes (mutual exclusions) permettent le partage des données ou du code.
Tu es assuré qu'un seul thread accedera aux données partagées.
Utilise CreateMutex qu'une seul fois par mutex.
Ensuite tu verrouille l'accés par WaitForSingleObject
et deverouille via ReleaseMutex

Merci bayeto 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 83 internautes ce mois-ci

Commenter la réponse de bayeto
bloobird0 30 Messages postés vendredi 6 février 2004Date d'inscription 23 octobre 2008 Dernière intervention - 25 janv. 2005 à 18:19
0
Merci
ok, si j'ai bien pigé, le CreateMutex permet de
- créer le mutex (sort de définition de variable)
- vérouiller tout de suite une variable par le thread qui a créée le mutex en mettant bInitialOwner à TRUE lors de l'appel.

Le WaitForSingleObject sert à attendre qu'elle soit dévérouillée et la vérouille de suite dès qu'elle est libre.

Pour que les threads soient non bloquants et que les échanges se fassent bien, il faut donc appeler ReleaseMutex dès que possible?
Commenter la réponse de bloobird0
ymca2003 2070 Messages postés mardi 22 avril 2003Date d'inscription 3 juillet 2006 Dernière intervention - 25 janv. 2005 à 18:25
0
Merci
Il y a aussi les CRITICAL_SECTION mais surtout le bouquin de richter :
http://brunews.free.fr/brunews/download/JR4.zip
http://brunews.free.fr/brunews/download/JR4Sources.zip
Commenter la réponse de ymca2003
bayeto 224 Messages postés mardi 12 août 2003Date d'inscription 18 octobre 2010 Dernière intervention - 25 janv. 2005 à 18:31
0
Merci
Tu n'es pas obligé de verouiller de suite le mutex avec le bInitialOwner à TRUE. WaitForSingleObject le verrouillera s'il ne l'est pas.
Tu as raison pour ReleaseMutex.

HANDLE mu = CreateMutex(NULL,FALSE,NULL);
(...)

//le thread n°1
WaitForSingleObject(mu,INFINITE);
ma_variable_partage = 10;
ReleaseMutex(mu);

//le thread n°2
WaitForSingleObject(mu,INFINITE);
cout << ma_variable_partage << endl;
ReleaseMutex(mu);

void clean_up() {
CloseHandle(mu);
}

Essaye egalement avec les CRITICAL_SECTIONs de Windows:

InitializeCriticalSection <=> CreateMutex
EnterCriticalSection <=> WaitForSingleObject
LeaveCriticalSection <=> ReleaseMutex
DeleteCriticalSection <=> CloseHandle
Commenter la réponse de bayeto
bloobird0 30 Messages postés vendredi 6 février 2004Date d'inscription 23 octobre 2008 Dernière intervention - 25 janv. 2005 à 18:37
0
Merci
merci 1000 fois bayeto, je vais déjà essayer les mutex et je regarderai ensuite avec les CriticalSection (mais j'ai regardé vite fait dans le MSDN, je ne vois pas bien la différence si ce n'est que le Mutex rajoute un timeout...).
Commenter la réponse de bloobird0

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.