thread persistant

thread persistant - C - Programmation

Marsh Posté le 03-02-2006 à 21:35:09    

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.
Reply

Marsh Posté le 03-02-2006 à 21:35:09   

Reply

Marsh Posté le 03-02-2006 à 21:48:28    

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.
Reply

Marsh Posté le 14-02-2006 à 10:55:57    

up svp :D


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

Marsh Posté le 14-02-2006 à 11:06:41    

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
Reply

Marsh Posté le 14-02-2006 à 12:10:11    

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.
Reply

Marsh Posté le 14-02-2006 à 12:16:50    

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.

Reply

Marsh Posté le 14-02-2006 à 12:52:37    

:jap:  :jap:


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

Marsh Posté le 14-02-2006 à 13:05:42    

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.
Reply

Marsh Posté le 14-02-2006 à 13:43:05    

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. }

Reply

Marsh Posté le 14-02-2006 à 16:42:06    

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.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed