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