Question sur les threads
Question sur les threads
J'ai commencé à jeter un coup d'oeuil aux threads, et je me demande:
Est il possible de passer plus d'un paramètre? (autrement qu'en les mettant tous dans une string avec un délimiteur entre chaqu'un)
Si je lance 2 threads de la même procedure, est ce qu'elles vont se marcher sur les pieds avec les variables (elles ne manipulent que des variables locale)?
Merci d'avance.
Est il possible de passer plus d'un paramètre? (autrement qu'en les mettant tous dans une string avec un délimiteur entre chaqu'un)
Si je lance 2 threads de la même procedure, est ce qu'elles vont se marcher sur les pieds avec les variables (elles ne manipulent que des variables locale)?
Merci d'avance.
Re: Question sur les threads
Il n'est pas possible de passer plus d'un paramètre mais faire une chaine de caractère avec un délimiteur est possible. Sinon tu peux aussi envoyer une adresse mémoire d'une structure par exemple.poshu a écrit :J'ai commencé à jeter un coup d'oeuil aux threads, et je me demande:
Est il possible de passer plus d'un paramètre? (autrement qu'en les mettant tous dans une string avec un délimiteur entre chaqu'un)
Non, pas de problèmesSi je lance 2 threads de la même procedure, est ce qu'elles vont se marcher sur les pieds avec les variables (elles ne manipulent que des variables locale)?

Exacte, tu ne peux passer qu'un paramètre mais comme Oliv l'a dit, le mieux est de passer une structure (un pointeur).
Par contre, je ne suis pas d'accord pour la deuxième question : tu auras INEVITABLEMENT des problèmes de variables en lancant 2 threads d'une même fonction !
Tu as un mécanisme appelé les exclusions mutuelles qui te permettrons d'éviter à un autre thread d'accéder à des variables en même temps, sous windows tu as aussi ce qu'on appel les sections critiques.
Voici ce que j'utilise lorsque j'utilise les threads et que je souhaites bloquer l'acces à une variable dans un thread : (code simplifié)
Utilisation :
-------------
- mutex_lock = MyCreateMutex()
- création du thead en essayant d'inclure mutex_lock comme membre de la structure passé au thread,
- dans le thread, des que tu souhaites bloquer l'acces à une variable globale, tu appels Mutex_P, la tu fais ce que tu veux de la variable et un Mutex_V rend l'acces,
- appeler MyDestroyMutex() à la fin du programme.
Par contre, je ne suis pas d'accord pour la deuxième question : tu auras INEVITABLEMENT des problèmes de variables en lancant 2 threads d'une même fonction !
Tu as un mécanisme appelé les exclusions mutuelles qui te permettrons d'éviter à un autre thread d'accéder à des variables en même temps, sous windows tu as aussi ce qu'on appel les sections critiques.
Voici ce que j'utilise lorsque j'utilise les threads et que je souhaites bloquer l'acces à une variable dans un thread : (code simplifié)
Code : Tout sélectionner
;- Mutex : it allow "private" access from the thread
#WAIT_FAILED = $FFFFFFFF
Structure mutex
ID.l
EndStructure
Global mutex_lock.l
;- Lock the access for the pMutex param object
Procedure Mutex_P(*pMutex.mutex)
If ( WaitForSingleObject_(*pMutex\ID, #INFINITE) = #WAIT_FAILED )
Debug "MutexP::Couldn't wait on mutex"
ProcedureReturn -1
EndIf
ProcedureReturn 0
EndProcedure
;- Unlock the access for the pMutex param object
Procedure Mutex_V(*pMutex.mutex)
If ( ReleaseMutex_(*pMutex\ID) = #False )
Debug "MutexV::Couldn't release mutex"
ProcedureReturn -1
EndIf
ProcedureReturn 0
EndProcedure
;- Create and return a mutex object, 0 on failure
Procedure MyCreateMutex()
Protected *m_pMutex.mutex
*m_pMutex = AllocateMemory(SizeOf(mutex))
If (*m_pMutex = 0)
Debug "m_pMutex memory allocation failed"
ProcedureReturn 0
EndIf
*m_pMutex\ID = CreateMutex_(#Null, #False, "_DSOUND_MUTEX_OBJECT")
If (*m_pMutex\ID <= 0)
Debug "Couldn't create mutex"
FreeMemory(*m_pMutex)
*m_pMutex = 0
ProcedureReturn 0
EndIf
ProcedureReturn *m_pMutex
EndProcedure
;- Free and destroy a mutex object
Procedure MyDestroyMutex(*pMutex.mutex)
If (*pMutex)
If (*pMutex\ID)
CloseHandle_(*pMutex\ID)
*pMutex\ID = 0
EndIf
EndIf
FreeMemory(*pMutex)
*pMutex = 0
EndProcedure
Utilisation :
-------------
- mutex_lock = MyCreateMutex()
- création du thead en essayant d'inclure mutex_lock comme membre de la structure passé au thread,
- dans le thread, des que tu souhaites bloquer l'acces à une variable globale, tu appels Mutex_P, la tu fais ce que tu veux de la variable et un Mutex_V rend l'acces,
- appeler MyDestroyMutex() à la fin du programme.
"Qui baise trop bouffe un poil." P. Desproges
-
- Messages : 1500
- Inscription : jeu. 25/mars/2004 11:23
- Localisation : Sophia Antipolis (Nice)
- Contact :
T'as fais un DUT info KarLKoX ???
Ca me rappelle qqchose les Mutex_P et Mutex_V : le principe des jetons ...

Ca me rappelle qqchose les Mutex_P et Mutex_V : le principe des jetons ...

Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Participez à son extension: ajouter vos programmes et partagez vos codes !
Encore moi ^__^
Encore un probleme de thread ^^;
Voila, est ce que je peux utiliser le principe d'exclusion mutuelle pour une fonction? cad, interdire l'acces à 2~3 fonctions pour les autres threads quand y'en a un qui se sert de ces quelques fonctions?
J'ai pensé à une méthode toute simple, mais je pense qu'il y a mieux. Donc avant d'utiliser les fonctions dont j'ai besoin, dans chaque thread, je rajoute ce code.
If FonctionLibre = 0
Repeat
Until FonctionLibre = 1
EndIf
FonctionLibre = 0
;code à exécuter
FonctionLibre = 1
Bon, c'est pas super-finaut, mais j'ai pas trouvé mieux. Je pense que si 2 threads sont pris dans la boucle en meme temps, il y a de fortes chance qu'ils en sortent en meme temps (vu la longueur de la boucle...), et que mon mécanisme d'exclusion ne serve absolument à rien >_>
Pouvez vous m'indiquer une meilleur méthode svp?
Merci ^__^
Encore un probleme de thread ^^;
Voila, est ce que je peux utiliser le principe d'exclusion mutuelle pour une fonction? cad, interdire l'acces à 2~3 fonctions pour les autres threads quand y'en a un qui se sert de ces quelques fonctions?
J'ai pensé à une méthode toute simple, mais je pense qu'il y a mieux. Donc avant d'utiliser les fonctions dont j'ai besoin, dans chaque thread, je rajoute ce code.
If FonctionLibre = 0
Repeat
Until FonctionLibre = 1
EndIf
FonctionLibre = 0
;code à exécuter
FonctionLibre = 1
Bon, c'est pas super-finaut, mais j'ai pas trouvé mieux. Je pense que si 2 threads sont pris dans la boucle en meme temps, il y a de fortes chance qu'ils en sortent en meme temps (vu la longueur de la boucle...), et que mon mécanisme d'exclusion ne serve absolument à rien >_>
Pouvez vous m'indiquer une meilleur méthode svp?
Merci ^__^