pthread_cond_* en particulier pthread_cond_signal !
6 réponses
Machine
Hello, j'aurais besoin d'un petit coup de main pour placer pthread_cond_sig=
nal dans le code suivant... je d=E9bute avec les threads et ne pas de solut=
ion...
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Cyprien Nicolas
Salut,
Le 27/09/2013 13:40, Machine écrivit :
Hello, j'aurais besoin d'un petit coup de main pour placer pthread_cond_signal dans le code suivant... je débute avec les threads et ne pas de solution...
Ça ressemble à un TP de programmation parallèle.
Je n'ai pas testé le programme, car je vois une erreur de logique dans ton main() :
int main(void) { struct list *l = init(); pthread_t t[MAX]; int i = 0; while(i++ < MAX) pthread_create(&t[i], NULL, (void *) push, (void *) l); for(i = 0; i < MAX; i++) pthread_join(t[i], NULL); return 0; }
Ton while (i++ < MAX), t[i]… peut pas être correct, vu que l'incrément se fait dans le test du while, i vaudra 1 dans le corps de la boucle, du coup t[0] n'est jamais initialisé.
Soit tu fais un for() comme en-dessous, soit plutôt un do-while avec préincrément, ou tu déplaces le post-incrément sur la dernière utilisation du i.
Mais je trouve cette dernière pas géniale car le ++ est /caché/ dans le corps de la boucle.
-- Cyp
Salut,
Le 27/09/2013 13:40, Machine écrivit :
Hello, j'aurais besoin d'un petit coup de main pour placer
pthread_cond_signal dans le code suivant... je débute avec
les threads et ne pas de solution...
Ça ressemble à un TP de programmation parallèle.
Je n'ai pas testé le programme, car je vois une erreur de logique dans
ton main() :
int main(void)
{
struct list *l = init();
pthread_t t[MAX];
int i = 0;
while(i++ < MAX) pthread_create(&t[i], NULL, (void *) push, (void *) l);
for(i = 0; i < MAX; i++) pthread_join(t[i], NULL);
return 0;
}
Ton while (i++ < MAX), t[i]… peut pas être correct, vu que
l'incrément se fait dans le test du while, i vaudra 1 dans le corps de
la boucle, du coup t[0] n'est jamais initialisé.
Soit tu fais un for() comme en-dessous, soit plutôt un do-while avec
préincrément, ou tu déplaces le post-incrément sur la dernière
utilisation du i.
Hello, j'aurais besoin d'un petit coup de main pour placer pthread_cond_signal dans le code suivant... je débute avec les threads et ne pas de solution...
Ça ressemble à un TP de programmation parallèle.
Je n'ai pas testé le programme, car je vois une erreur de logique dans ton main() :
int main(void) { struct list *l = init(); pthread_t t[MAX]; int i = 0; while(i++ < MAX) pthread_create(&t[i], NULL, (void *) push, (void *) l); for(i = 0; i < MAX; i++) pthread_join(t[i], NULL); return 0; }
Ton while (i++ < MAX), t[i]… peut pas être correct, vu que l'incrément se fait dans le test du while, i vaudra 1 dans le corps de la boucle, du coup t[0] n'est jamais initialisé.
Soit tu fais un for() comme en-dessous, soit plutôt un do-while avec préincrément, ou tu déplaces le post-incrément sur la dernière utilisation du i.
Mais je trouve cette dernière pas géniale car le ++ est /caché/ dans le corps de la boucle.
-- Cyp
Machine
Le vendredi 27 septembre 2013 15:49:56 UTC+2, Cyprien Nicolas a écrit :
Sans vouloir faire d'histoire, l'objet du post est d'abord la fonction push et en particulier les fonctions pthreads_cond_*... en testant le code vous auriez compris que do/while ou for(;;) ne le debug pas...
Le vendredi 27 septembre 2013 15:49:56 UTC+2, Cyprien Nicolas a écrit :
Sans vouloir faire d'histoire, l'objet du post est d'abord la fonction push et en particulier les fonctions pthreads_cond_*... en testant le code vous auriez compris que do/while ou for(;;) ne le debug pas...
Le vendredi 27 septembre 2013 15:49:56 UTC+2, Cyprien Nicolas a écrit :
Sans vouloir faire d'histoire, l'objet du post est d'abord la fonction push et en particulier les fonctions pthreads_cond_*... en testant le code vous auriez compris que do/while ou for(;;) ne le debug pas...
Cyprien Nicolas
Le 27/09/2013 19:00, Machine écrivit :
Le vendredi 27 septembre 2013 15:49:56 UTC+2, Cyprien Nicolas a écrit :
Sans vouloir faire d'histoire, l'objet du post est d'abord la fonction push et en particulier les fonctions pthreads_cond_*... en testant le code vous auriez compris que do/while ou for(;;) ne le debug pas...
Ah ben après coup j'ai testé, et ça segfault dans le for(), donc si, il y a bien un problème à cet endroit là.
Le reste du programme dans le push me semble correct, l'objet du post ne mentionnait pas pourquoi ça marche pas, en décrivant le comportement attendu, et le comportement constaté, il m'est difficile d'aider plus avant.
PS: vos lignes sont un peu longues…
-- « Ceci n'est pas une signature. » — René Magritte (Apocryphe)
Le 27/09/2013 19:00, Machine écrivit :
Le vendredi 27 septembre 2013 15:49:56 UTC+2, Cyprien Nicolas a
écrit :
Sans vouloir faire d'histoire, l'objet du post est d'abord la
fonction push et en particulier les fonctions pthreads_cond_*... en
testant le code vous auriez compris que do/while ou for(;;) ne le
debug pas...
Ah ben après coup j'ai testé, et ça segfault dans le for(), donc si, il
y a bien un problème à cet endroit là.
Le reste du programme dans le push me semble correct, l'objet du post ne
mentionnait pas pourquoi ça marche pas, en décrivant le comportement
attendu, et le comportement constaté, il m'est difficile d'aider plus avant.
PS: vos lignes sont un peu longues…
--
« Ceci n'est pas une signature. » — René Magritte (Apocryphe)
Le vendredi 27 septembre 2013 15:49:56 UTC+2, Cyprien Nicolas a écrit :
Sans vouloir faire d'histoire, l'objet du post est d'abord la fonction push et en particulier les fonctions pthreads_cond_*... en testant le code vous auriez compris que do/while ou for(;;) ne le debug pas...
Ah ben après coup j'ai testé, et ça segfault dans le for(), donc si, il y a bien un problème à cet endroit là.
Le reste du programme dans le push me semble correct, l'objet du post ne mentionnait pas pourquoi ça marche pas, en décrivant le comportement attendu, et le comportement constaté, il m'est difficile d'aider plus avant.
PS: vos lignes sont un peu longues…
-- « Ceci n'est pas une signature. » — René Magritte (Apocryphe)
Lucas Levrel
Le 27 septembre 2013, Machine a écrit :
Hello, j'aurais besoin d'un petit coup de main pour placer pthread_cond_signal dans le code suivant... je débute avec les threads et ne pas de solution...
Normalement un cond_wait est dans un while(!macondition). Renseigne-toi sur les « spurious wakeups ».
-- LL
Le 27 septembre 2013, Machine a écrit :
Hello, j'aurais besoin d'un petit coup de main pour placer
pthread_cond_signal dans le code suivant... je débute avec les threads
et ne pas de solution...
Normalement un cond_wait est dans un while(!macondition). Renseigne-toi
sur les « spurious wakeups ».
Hello, j'aurais besoin d'un petit coup de main pour placer pthread_cond_signal dans le code suivant... je débute avec les threads et ne pas de solution...
Normalement un cond_wait est dans un while(!macondition). Renseigne-toi sur les « spurious wakeups ».
les lock/unlock/condition_wait et condition_signal sont des macros qui lancent les fonctions pthread ou leur équivalent windows selon l'OS ou la bibliothèque utilisée.
-- Richard
Le 27/09/2013 13:40, Machine a écrit :
void push(struct list *p)
{
int i = 0;
pthread_mutex_lock(&stack.mutex_zone);
while(i != 1000) {
pthread_cond_wait(&stack.condition, &stack.mutex_zone);
le programme bloque ici... le reste n'ai jamais exécuté
les lock/unlock/condition_wait et condition_signal sont des macros qui
lancent les fonctions pthread ou leur équivalent windows selon l'OS ou
la bibliothèque utilisée.
les lock/unlock/condition_wait et condition_signal sont des macros qui lancent les fonctions pthread ou leur équivalent windows selon l'OS ou la bibliothèque utilisée.