Bonjour tout le monde.

Voila cela fait un petit moment que j'étudie les signaux dans le but de mettre une thread sur pause. Je me heurte à quelque petit souci technique on va dire^^.

Au bout d'un moment mon programme ce bloque il ce fige tous simplement au lieu de tourner indéfiniment.

Voila la source. Programme réaliser sous linux
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <signal.h>
 
using namespace std;
#define RESUME_SIG SIGUSR2
#define SUSPEND_SIG SIGUSR1
 
sigset_t mask, maskold, maskwait,signal_mask;
volatile sig_atomic_t Continuer = 0;
int sig;
struct sigaction sa,su;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static void *thr_func(void *arg)
{
	//Masque tous les signaux à part ce qui suspende et lance la thread
	sigset_t maskthread;
	sigfillset(&maskthread);
    	sigdelset(&maskthread, RESUME_SIG);
	sigdelset(&maskthread, SUSPEND_SIG);
	pthread_sigmask(SIG_SETMASK, &maskthread, NULL);
	int *id = (int *)arg;
	while(1)
	{
		usleep(10000);
		std::cout << "Thread "<< id << std::endl;	
	}
	pthread_exit(NULL);
}
 
void suspend_thread(int signal)
{
	std::cout << "SIGSUSPEND" << std::endl;
    	sigemptyset(&signal_mask);
    	sigaddset(&signal_mask, RESUME_SIG);
    	int sig;
    	sigwait(&signal_mask,&sig);
	std::cout << "SIGRESUME" << std::endl;
}
 
void resume_thread(int signal)
{
	cout << "RESUME" << endl;
	Continuer = 0;
}
	//sigemptyset(&sa.sa_mask);
	//sigaddset(&sa.sa_mask, SUSPEND_SIG);
int main()
{
	pthread_t th;
	int id = 1, iteration = 0;
	bool w1 = false;
 
 
	sigemptyset(&mask);
    	sigaddset(&mask, RESUME_SIG);
	sigaddset(&mask, SUSPEND_SIG);
	sigprocmask(SIG_BLOCK,&mask,NULL);
    	pthread_sigmask(SIG_BLOCK, &mask, NULL);
 
	sigfillset(&sa.sa_mask);
	sigdelset(&sa.sa_mask, RESUME_SIG);
	sigdelset(&sa.sa_mask, SUSPEND_SIG);
   	sa.sa_flags = 0;
    	sa.sa_handler = suspend_thread;
    	sigaction(SUSPEND_SIG, &sa, NULL);
 
	sigfillset(&su.sa_mask);
	sigdelset(&su.sa_mask, RESUME_SIG);
	sigdelset(&su.sa_mask, SUSPEND_SIG);
   	su.sa_flags = 0;
    	su.sa_handler = resume_thread;
    	sigaction(RESUME_SIG, &su, NULL);
 
	pthread_create(&th, NULL, thr_func, (void *)id);
 
	while(1)
	{
		usleep(100000);
		iteration++;
		std::cout << "Main " << iteration  << std::endl;
		if(w1 == false)
		{
			std::cout << "Sending Pause"<< std::endl;
			w1 = true;
			pthread_kill(th, SUSPEND_SIG);
			std::cout << "End Sending Pause "<< std::endl;
		}
		else
		{
			std::cout << "Sending Resume"<< std::endl;
			w1 = false;
			pthread_kill(th, RESUME_SIG);
			std::cout << "End Sending Resume"<< std::endl;
		}	
	}
	return 0;
}
En analysant les retours j'ai l'impression que c'est pthread_kill qui bloque à un moment tous simplement. J'ai fais d'autre version pour tester d'autre algo.

Si quelqu'un à a des idée^^

Merci d'avance