IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

multithreading et timer


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut multithreading et timer
    bonjour,
    je suis entrain de faire une application qui doit (mais peut ne pas) finir une tache dans un temps imparti.
    j'ai donc decider d'utiliser 2 threads car dans certain cas la dite tache peut etre entrain de lire une socket ou un discripteur qui n'est pas pret (donc attend).

    voici le main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    pthread_t tid,ctr,*ctr_ret;
    pthread_create(&ctr,(void *)m_timer,NULL);
    pthread_create(&ctr,(void *)operate,NULL);
    pthread_join(ctr,(void **)&ctr_ret);
    je passe simplifie le code de operate qui est trop long pour etre mis ici (sauf si vous insistez):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    size=read_myfd(fd,4);
    if(size<0)
    {
       free(myvar);
       close(fd);
       return NULL;
    }
    total_size+=size;
    REALLOC(char,myvar,total_size);
    ...
    return myvar;
    puis la fonction m_timer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    void m_timer(int interval)                                                                           
    {   
        time_t entrance,now;                                                                             
     
        time(&entrance);                                                                                 
        do                                                                                               
        {   
            time(&now);
            if(now-entrance>=interval)                                                                   
            {   
                fprintf(stderr,"timeout exiting\n");                                                     
                break;                                                                                   
            }
        }while(1);                                                                                       
     
    }
    ma question est comment faire en sorte que lorsque m_timer termine, je puisse terminer aussi operate en ayant la possibilite de free(myvar)?
    merci pour le temps que vous passez a lire mes idee tordus, peut etre qu'il y a mieux a faire que du multithreading sur le coup?

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ouch! Une boucle d'attente active?
    Et en plus, avec des casts de pointeur de fonction?

    En plus, on n'a pas toute la spécification du problème. Qu'est-ce qui doit se passer si le timeout expire et que la lecture est toujours en cours? Qu'est-ce qui doit se passer si la lecture se termine dans le temps imparti? etc.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre très actif

    Femme Profil pro
    Collégien
    Inscrit en
    Juillet 2010
    Messages
    591
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juillet 2010
    Messages : 591
    Par défaut
    ma question est comment faire en sorte que lorsque m_timer termine, je puisse terminer aussi operate en ayant la possibilite de free(myvar)?
    Tu peut utiliser les 3 ème paramètre de la fonction pthread_create (ici à NULL), pour passer un pointer sur une zone mémoire (structure), qui contiendra ton intervalle de temps, et un drapeau qui indiquera de quitter le thread (utilise pthread_exit). Il faudra dans la boucle des thread venir régulièrement lire ou écrire dans ce drapeau.
    N'oublie pas de protéger tes accès à cette structure par un pthread_mutex_t (que tu peux d’ailleurs intégrer à la structure).

    j'ai donc decider d'utiliser 2 threads car dans certain cas la dite tache peut etre entrain de lire une socket ou un discripteur qui n'est pas pret (donc attend).
    Tu ne peux pas arrêter un thread qui effectue une lecture bloquante sur un descripteur. Tu dois soit paramétrer le descripteur pour que la lecture soit non bloquante. Soit être sure qui il a des données à lire sur le descripteur (fonction "select")

    j'espère aider.
    @+

  4. #4
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut
    laisses tomber les cast, j'ai pas recopier textuellement ce qui devait etre.
    si ca se termine dans les temps imparti, on traite myvar.
    je me rend compte en relisant que c'est pas tres propre surtout qu'on doit recuperer la valeur de myvar qui est char *.
    bref le probleme n'est pas vraiment la, celui je le reglerai.


    @mith06, oui pour le 3eme parametre, en faite il n'etait pas supposer etre a NULL mais bien une structure, je vais donc si j'ai bien compris ajouter l'intervall un un drapeau genre TO_exit (0=continue,1=timeout). Toujours si j'ai bien compris dans le thread m_timer quand le temps est arrive je met to_exit=1 (apres mutex biensur) et dans operate je guette de temps en temps la valuer to TO_exit.
    si c'est bien ce que tu me proposes, j'ai un autre probleme. la fonction readfd utilise read qui bloque tant qu'il n'a pas lu de caractere ou pas eu d'erreur, la ca va me posser un probleme pour tester la valeur du flag

  5. #5
    Membre très actif

    Femme Profil pro
    Collégien
    Inscrit en
    Juillet 2010
    Messages
    591
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juillet 2010
    Messages : 591
    Par défaut
    j'avais éditer mon poste entre temps...


    j'ai donc decider d'utiliser 2 threads car dans certain cas la dite tache peut etre entrain de lire une socket ou un discripteur qui n'est pas pret (donc attend).
    Tu ne peux pas arrêter un thread qui effectue une lecture bloquante sur un descripteur. Tu dois soit paramétrer le descripteur pour que la lecture soit non bloquante. Soit être sure qui il a des données à lire sur le descripteur (fonction "select")

  6. #6
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut
    donc je resume, tu confirmes et je marque resolut .

    je passe le flag aux deux fonctions, l'intervall a m_timer
    dans m_timer je mets le flag a 1 quand le temps est ecoule,
    dans operate je verifie a chaque iteration si le flag est passer de 0 a 1 et avant de commencer a faire un action sur le descripter je verifie avant avec select.
    si le drapeau est a 1 je peut liberer toute la memoire utiliser et fermer les descripteurs.
    on va faire encore jolie, si operate fini avant m_timer c'est lui qui demande a m_timer d'arreter.
    j'ai bon? si tu vois un probleme ...

    en y pensant je me dis que si select peut m'empecher d'attendre inutilement read, je peux donc me passer du 2eme thread. et just tester si fd est prets sinon juste tester le l'interval?

  7. #7
    Membre très actif

    Femme Profil pro
    Collégien
    Inscrit en
    Juillet 2010
    Messages
    591
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juillet 2010
    Messages : 591
    Par défaut
    Oui tu peux te passer du deuxième thread

    Et d'une manière générale :

    finir une tache dans un temps imparti => Oublier tout ce qui est asynchrone => oublier tout ce qui est lecture/attente bloquante (Attention à pthread_mutex_lock qui est bloquant, mais heureusement il y a pthread_mutex_try_lock).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] multithread et timer
    Par mich35 dans le forum C#
    Réponses: 2
    Dernier message: 09/07/2012, 17h12
  2. Problème gestion timer multithread
    Par jimmylekib dans le forum C++
    Réponses: 3
    Dernier message: 04/06/2008, 15h49
  3. Timer de précision
    Par guigui dans le forum MFC
    Réponses: 1
    Dernier message: 04/12/2002, 15h21
  4. Timer en µsecondes
    Par Dagobert dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 25/11/2002, 00h59
  5. Multithreading sous HP Ux 11
    Par pykoon dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 18/10/2002, 23h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo