Question sur les threads

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Question sur les threads

Message par poshu »

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.
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Re: Question sur les threads

Message par Oliv »

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)
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.
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)?
Non, pas de problèmes :D
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message par KarLKoX »

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é)

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
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

moi j'étais persuadé que celles les variables statiques représentaient un risque dans ce cas là...

Dri :-?
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message par KarLKoX »

http://bob.developpez.com/tutapiwin/article_54.php

C'est le seul lien en français que j'ai trouvé :)
"Qui baise trop bouffe un poil." P. Desproges
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Je pensais que les variables utilisées dans les threads (donc non globales) ne pouvaient pas intéragir :oops:
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Message par poshu »

J'esperais ca aussi.

Merci pour ces réponses
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

T'as fais un DUT info KarLKoX ??? :P

Ca me rappelle qqchose les Mutex_P et Mutex_V : le principe des jetons ... :D
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message par KarLKoX »

Non pas de DUT ni d'autre cursus scolaire informatique malheureusement, c'est juste que je lis beaucoup d'algo à droite, à gauche :P
"Qui baise trop bouffe un poil." P. Desproges
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Message par poshu »

Re ^_^

Une autre question: est ce que 2 thread peuvent acceder au meme tableau en meme temps si ils ne touchent pas la meme case?
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message par KarLKoX »

Je pense que le tableau est statique (donnée initialisée et n'étant pas modifiée), si c'est le cas, je pense qu'il n'y a pas trop de risque.
J'espère que quelqu'un qui connait la prog sécurisée confirmera ou infirmera :)
"Qui baise trop bouffe un poil." P. Desproges
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Message par poshu »

spas cool >_>

Le probleme, c'est que si je dois attendre qu'un thread ai fini de faire mumuse avec telle variable pour qu'un autre se l'aproprie, je gagne absolument pas de temps, c'est rudement genant ca T_T
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message par KarLKoX »

Bah tant que tu ne modifies pas ta variable, il n'y a aucun problème, c'est lors de la modification de celle ci qu'il faut bloquer son accès.
"Qui baise trop bouffe un poil." P. Desproges
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Message par poshu »

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 ^__^
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Message par poshu »

J'ai trouvé tout seul en fait, c'était tout simple ^^;
Répondre