CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Question threads

yumax
yumax
Niveau 49
09 octobre 2015 à 19:59:11

Bonsoir à tous, j'ai demain un partiel de prog système et je suis en train de réviser à l'aide des annales des années précédentes.

Un exo a attiré mon attention, il s'agit d'un code dans lequel se trouvent "deux erreurs grossières" :

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/types.h>
#include <unistd.h>
#define NBTH 10
int somme = 0;

void * ajouteur(void * arg) {
	int numthread = * (int*) arg;
	int i;
	printf("ajouteur: getpid()=%d\n", getpid());
	for (i = 0; i < 1000000; i++) {
	somme += numthread;
	}
	return NULL;
}

int main(int argc, char** argv) {
	int i;
	pthread_t threads[NBTH];
	
	printf("main: getpid()=%d\n", getpid());
	
	for (i = 0; i < NBTH; i++) {
		pthread_create(
		&threads[i], NULL, ajouteur, &i);
	}
	
	for (i = 0; i < NBTH; i++) {
		pthread_join(threads[i], NULL);
	}
	
	printf("somme=%d\n", somme);
return 0;
}

Selon moi, la première erreur grossière est évidemment d'avoir passé i (qui est l'itérateur de boucle) en paramètre dans le pthread_create, provoquant une condition de compétition. Cependant, je peine à trouver la deuxième erreur : serait-ce la variable somme déclarée en globale ?

Merci d'avance pour votre aide :p)

yumax
yumax
Niveau 49
09 octobre 2015 à 20:01:41

Petite précision, il ne s'agit pas de l'affichage des pid, une autre question du sujet était de commenter l'affichage des getpid() (=> pid identique pour tous les threads)

Message édité le 09 octobre 2015 à 20:02:12 par yumax
yumax
yumax
Niveau 49
09 octobre 2015 à 20:35:28

Ah, autre précision, ce code doit faire ajouter 1000000 de fois le numéro d'ordre de chacun des threads à la variable somme, donc j'ai dit des conneries, ça ne peut pas être la globale "somme" le problème

Message édité le 09 octobre 2015 à 20:37:33 par yumax
yumax
yumax
Niveau 49
09 octobre 2015 à 20:42:47

J'ai une piste : ne faut-il pas faire de l'incrémentation une section critique protégée par des mutex ? vu que la variable somme est globale (sorry quadruple post)

godrik
godrik
Niveau 30
09 octobre 2015 à 22:27:01

Salut a toi,

evidement, somme est une variable partage, rien ne gere l'access exclusif a cette variable, et elle est modifie de facon concurrente. Il faut donc la proteger d'une facon ou d'une autre.

Le deuxieme probleme est le parametre qui est passe aux threads. Comme tu passes l'adresse de la variable i aux thread et que main va changer cette valeure, il est probable que le threads ne lisent pas son numero de thread, mais la valeur de au moment ou le thread demarre vraiment.

yumax
yumax
Niveau 49
10 octobre 2015 à 00:15:55

Merci à toi godrik ! Je te souhaite une bonne soirée ! :)

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment