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 :

Impossible d'annuler mes threads


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 35
    Par défaut Impossible d'annuler mes threads
    Bonjour à tous voilà je créé mon pool de thread

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    pthread_t *Clients = NULL;
     
    int main(int argc,char *argv[])
    {
    Clients = (pthread_t *)malloc(max_threads * sizeof(pthread_t));
    pthread_create(&ThreadStop,NULL,(void *(*)(void *))Thread_Stop,NULL);
        pthread_detach(ThreadStop);
            for(int i = 0;i<max_threads;i++)
            {
                pthread_create(&Clients[i],NULL,(void *(*)(void *))Thread_Client,NULL);
                pthread_detach(Clients[i]);
            }      
    }


    Chaque thread exécute la fonction suivante
    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
    17
    18
    19
    20
    21
    22
    23
    void Thread_Client()
    {
        pthread_cleanup_push(Cleanup_Client,0);
        int rc;
     
        if(pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,&rc))
        {
            perror("");
            exit(1);
        }
     
        if(pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,&rc))
        {
            perror("");
            exit(1);
        }  
        cout << "(Thread client) en attente" << endl;
        pthread_mutex_lock(&MutexThreadClient);
        pthread_cond_wait(&CondThreadClients,&MutexThreadClient);
        pthread_mutex_unlock(&MutexThreadClient);
        cout << "(Thread client) start" << endl;
        pthread_cleanup_pop(1);
    }
    J'ai un thread STOP qui a pour role d'annuler mes threads client
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    void Thread_Stop()
    {
        struct sigaction action;
        sigset_t mask;
     
        sigemptyset(&mask);
        sigaddset(&mask,SIGALRM);
        sigaddset(&mask,SIGINT);
        sigprocmask(SIG_SETMASK,&mask,NULL);
     
        sigemptyset(&action.sa_mask);
        action.sa_handler = Handler_Stop;
        action.sa_flags = SA_SIGINFO;
        sigaction(SIGALRM,&action,NULL);
        sigaction(SIGINT,&action,NULL);
     
        cout << "(Thread_Stop) en attente..." << endl;
        pthread_mutex_lock(&MutexThreadStop);
        pthread_cond_wait(&CondThreadStop,&MutexThreadStop);
        pthread_mutex_unlock(&MutexThreadStop);
        cout << "(Thread_Stop) reveille !" << endl;
     
        pthread_mutex_lock(&MutexDelay);
        alarm(delay);
        pthread_mutex_unlock(&MutexDelay);
        cout << "delay de" << delay << " seconde(s) " << endl;
        //pause();
     
        for(int i = 0;i<max_threads;i++)
        {
            pthread_cancel(Clients[i]);
        }
     
        cout << "* (Thread_Stop) Fin du ThreadStop *" << endl;
        trace << "* (Thread_Stop) Fin du ThreadStop *";
    }
    Dès que je fait un ctrc + C, je réveille mon thread STOP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void Handler_Stop(int signal)
    {
        cout << "(Handler_Stop) Signal :" << signal << endl;
        pthread_cond_signal(&CondThreadStop);
     
     
    }
    Pensant que les threads clients seront belle et bien correctement arrêté, mais non ma fonction de terminaison n'est exécuté qu'une seule fois par qu'un seul thread client...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Cleanup_Client(void *p)
    {
        cout << "* (Thread_Client) Fin d'un Thread_Client *" << endl;
    }
    Une idée ?

    Merci d'avance

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 6
    Par défaut
    salut,

    Les inits de tes mutexs sont ou ?

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/09/2006, 17h24
  2. Réponses: 9
    Dernier message: 12/05/2006, 09h06
  3. [MySQL] impossible d'executer mes deux updates a la suite
    Par budylove dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 03/05/2006, 14h49
  4. [Outlook] Impossible de récupérer mes messages ...
    Par Rumeurs dans le forum Outlook
    Réponses: 4
    Dernier message: 13/04/2006, 19h05

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