Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1778 connectés 

  FORUM HardWare.fr
  Programmation
  C

  thread persistant

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

thread persistant

n°1298880
bipeuh
Posté le 03-02-2006 à 21:35:09  profilanswer
 

j'


Message édité par bipeuh le 03-02-2006 à 22:01:53

---------------
celui qui pose une question est idiot 5 minutes, celui qui n'en pose pas le reste toute sa vie.
mood
Publicité
Posté le 03-02-2006 à 21:35:09  profilanswer
 

n°1298893
bipeuh
Posté le 03-02-2006 à 21:48:28  profilanswer
 

désolé, clic malencontreux...
 
j'ai un automate logiciel développé en C. Celui-ci qui rafraîchit des entrées, exécute des grafcets puis actionne des sorties sur une période de 10ms. Certaines fonctions nécessaires au bon fonctionnement sont blocantes (jusqu'à 500ms...). D'où la nécessité de détacher ces fonctions blocantes dans un thread indépendant.
voilà le code :

Code :
  1. void *(fthreadfils)()
  2. {
  3. unsigned char TableOctetBufTXSDO[5];
  4. unsigned char TableOctetBufRXSDO[10];
  5. unsigned long Msg_Param;
  6. int i;
  7. Msg_Param = ( SUB_INDEX << 16 ) | INDEX;
  8. NB_BYTE_TX = 1;
  9. TableOctetBufTXSDO[0] = 0x01; // cmde CANOpen pour une lecture SDO
  10. NB_BYTE_RX = 10;   // taille maxi du tampon de réception
  11. AuWriteReadMsg_io(CARD2CHAN(CARD),EQUIPMT_VISE,Msg_Param,NB_BYTE_TX, TableOctetBufTXSDO, &NB_BYTE_RX, TableOctetBufRXSDO, &STATUS_SDO) ) //fonction blocante
  12. ENVOI_SDO = 0;
  13. //fin de la tache fille
  14. pthread_exit(NULL);
  15. }


 
et le code appelant :
 

Code :
  1. pthread_t pthreadfils;  //lance la tache fille
  2.  if (pthread_create(&pthreadfils,NULL, fthreadfils, NULL) != 0)
  3.  {
  4.   perror("erreur de create_thread" );
  5.   //traitement de ce cas
  6.  }
  7.  pthread_detach(pthreadfils);


 
mon problème (s'il en est un...) c'est que lorsque j'appelle la commande ps -au, je constate que le thread fils est toujours présent, y compris après le temps théorique de durée de vie. Quelqu'un a-t-il une explication? quels sont les dangers? des conseils à m'apporter?
 
merci


Message édité par bipeuh le 06-02-2006 à 08:20:54

---------------
celui qui pose une question est idiot 5 minutes, celui qui n'en pose pas le reste toute sa vie.
n°1304987
bipeuh
Posté le 14-02-2006 à 10:55:57  profilanswer
 

up svp :D


---------------
celui qui pose une question est idiot 5 minutes, celui qui n'en pose pas le reste toute sa vie.
n°1304997
xilebo
noone
Posté le 14-02-2006 à 11:06:41  profilanswer
 

lorsque tu crées un thread sous linux sans passer de parametre, il est par défaut en mode normal, il faut donc appeler la fonction pthread_join pour liberer la ressource.
 
Tu peux par contre créer des threads en mode détaché, ils sont libéré dès que la fonction de thread se termine. En contrepartie, il me semble que tu ne peux pas faire un certain type d'opération sur le thread (comme suspendre le thread ).  
 
 
pour créer un thread en mode détaché,voici comment je fais :  
 

Code :
  1. pthread_attr_t attr;
  2. pthread_attr_init(&attr);
  3. pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
  4. pthread_create(&m_hThread,&attr,DefaultThreadFunc, this);


 
 
Les dangers : si ton thread n'est pas libéré, tu peux atteindre facilement la limite (MAX_THREADS qui doit valoir 1024) , et donc ne plus avoir la possibilité de créer un thread supplémentaire.


Message édité par xilebo le 14-02-2006 à 11:07:52
n°1305053
bipeuh
Posté le 14-02-2006 à 12:10:11  profilanswer
 

merci
 
est-ce que le thread en mode détaché a toujours accès aux variables globales du code appelant?


---------------
celui qui pose une question est idiot 5 minutes, celui qui n'en pose pas le reste toute sa vie.
n°1305062
xilebo
noone
Posté le 14-02-2006 à 12:16:50  profilanswer
 

bipeuh a écrit :

merci
 
est-ce que le thread en mode détaché a toujours accès aux variables globales du code appelant?


 
 
il a accès aux mêmes choses qu'un thread créé normalement. En général, je passe en paramètre les variables sur lesquelles le thread doit travailler.

n°1305099
bipeuh
Posté le 14-02-2006 à 12:52:37  profilanswer
 

:jap:  :jap:


---------------
celui qui pose une question est idiot 5 minutes, celui qui n'en pose pas le reste toute sa vie.
n°1305111
bipeuh
Posté le 14-02-2006 à 13:05:42  profilanswer
 

Code :
  1. pthread_attr_t attr;
  2. pthread_attr_init(&attr);
  3. pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
  4. pthread_create(&m_hThread,&attr,DefaultThreadFunc, this);


 
 :??: peux-tu m'en dire plus au sujet du 'this'?


---------------
celui qui pose une question est idiot 5 minutes, celui qui n'en pose pas le reste toute sa vie.
n°1305138
xilebo
noone
Posté le 14-02-2006 à 13:43:05  profilanswer
 

oups désolé. J'ai fait un copier-coller de mon code source. this ,c'est du C++. Je reformule mon post puisqu'on est dans la catégorie C:
 
Voici un exemple qui crée un thread en mode détaché, et un thread en mode normal. Le dernier paramètre de la fonction pthread_create contient l'adresse des paramètres que tu souhaites passer (souvent une structure, mais pas nécessairement, et peut etre NULL si on n'a pas besoin de passer de paramètre).
 

Code :
  1. typedef struct {
  2.     int a;
  3.     int b;
  4. }Params;
  5. // fonction qui contient le code du thread
  6. void * MyFunc(void *pParam) {
  7. // récupérer les paramètres
  8.   Params *p = (Params *) pParam;
  9. // puis faire le traitement ...
  10. }
  11. main() {
  12. pthread_t ThreadID;
  13. pthread_attr_t attr;
  14. Params MyParam;
  15. // code en mode détaché
  16. pthread_attr_init(&attr);
  17. pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
  18. MyParam.a = 0;
  19. MyParam.b = 0;
  20. pthread_create(&ThreadID,&attr,MyFunc, &MyParam);
  21. // code en mode normal
  22. pthread_create(&ThreadID,NULL,MyFunc,&MyParam);
  23. // ne pas oublier dans ce cas le pthread_join
  24. pthread_join(&ThreadID,NULL);
  25. }

n°1305422
bipeuh
Posté le 14-02-2006 à 16:42:06  profilanswer
 

Merci pour ton exemple. Peux-tu me dire si ces deux méthodes sont équivalentes ou pas (mode détaché)?
 

Code :
  1. // fonction qui contient le code du thread  
  2. void * MyFunc(void)
  3. {
  4. //traitement ...  
  5. }
  6. int main(void)
  7. {
  8. pthread_t ThreadID;
  9. // code en mode détaché 1
  10. pthread_attr_t attr;
  11. pthread_attr_init(&attr);
  12. pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
  13. pthread_create(&ThreadID,&attr,MyFunc, NULL);
  14. //code en mode détaché 2
  15. pthread_create(&ThreadID,NULL,MyFunc, NULL);
  16. pthread_detach(MyFunc);
  17. }


 


Message édité par bipeuh le 14-02-2006 à 16:53:56

---------------
celui qui pose une question est idiot 5 minutes, celui qui n'en pose pas le reste toute sa vie.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  thread persistant

 

Sujets relatifs
GTK et les Thread[URGENT] Comment relancer un Thread après sa création?
Thread Perl (Urgentissime--Help)[Java] synchro entre thread: wait() et notify() -> pb [RESOLU]
problème avec Thread.sleep() dans des tests Junit...Pbl l'éxécution java HelloWorlApp message :"Exception in thread"main".
threadSleep dans les thread java
ThreadSavoir quand un thread ce termine
Plus de sujets relatifs à : thread persistant


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)