Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 27/02/2008, à 22:00

ezaeza

[C++][Résolu] comportement bizarre de thread

Bonjours,
j'ai passé pas mal de temps à chercher des code, a tester 2 ou 3 trucs dessus, mais y'a rien qui marche :
si je fait 2 threads en parallèle, l'un est exécuté pendant trop longtemps, puis c'est au tours de l'autre etc ...

J'ai donc fait un code pour compter le nombre de changement de thread sur 2 boucle for de 100000 itérations chacune, et le résultat confirme ce que je le dis : les threads sont exécutés pendant trop longtemps

je compile avec

g++ main.cc -o main -lpthread

Et le code source (moche, mais simple pour limiter le nombre d'erreur possible) :

// programme pour compteur le nombre d'echange en 2 thread
#include <iostream>
#include <pthread.h>
#include <unistd.h> // pour sleep

static pthread_mutex_t mutex;
static int compteur;
static bool dans_th1;

// la fonction exécutée par le thread 1
void *th1(void*)
{
	for ( int i = 0; i < 100000; i++ )
	{
		pthread_mutex_lock(&mutex);
		if ( !dans_th1)
		{
			dans_th1 = true;
			compteur++;
		}
		pthread_mutex_unlock(&mutex);
	}
	return NULL;
}

// la fonction éxécutée par le thread 2
void *th2(void*)
{
	for ( int i = 0; i < 100000; i++ )
	{
		pthread_mutex_lock(&mutex);
		if ( dans_th1)
		{
			dans_th1 = false;
			compteur++;
		}
		pthread_mutex_unlock(&mutex);
	}
	return NULL;
}

int main(int argc, char *argv[])
{
	pthread_t thread1, thread2;
	pthread_mutex_init (&mutex, NULL);
	compteur = 0;
	dans_th1 = true;
	
	//création des threads
	if (pthread_create (&thread1, NULL, (void * (*)(void*))th1, NULL) < 0)
	{
		fprintf (stderr, "Impossible de créer le thread 1\n");
		exit (1);
	}

	if (pthread_create (&thread2, NULL, (void * (*)(void*))th2, NULL) < 0)
	{
		fprintf (stderr, "Impossible de créer le thread 2\n");
		exit (1);
	}
	
	// appelle des threads
	pthread_join (thread1, 0);
	pthread_join (thread2, 0);
	
	//attente de la fin des threads (temps très large)
	sleep(2);
	std::cout << "A changé " << compteur << " fois de thread" << std::endl;
	return 0;
}

Et le résultats de plusieurs lancement du code sur mon PC :
A changé 1 fois de thread (donc exécution du premier, puis passage au 2eme quand le 1er est fini)
A changé 1 fois de thread
A changé 2 fois de thread
A changé 1 fois de thread
A changé 3 fois de thread

Donc voilà mes threads marchent, il arrive qu'ils s'alternent, mais bon sur 2 boucle for de 100000 tours, j'ai cru comprendre que je devrais avoir un résultat du genre "A changé 30000 fois de thread"

Donc mes questions : le code vous renvoie quoi chez vous (histoire de confirmer que c'est bien mon PC qui va pas), et quelqu'un a-t-il une idée pour corriger ce problème ?

Ma config : (X)Ubuntu Gusty Guibon (j'ai les 2, mais je fait mes tests sur XUbuntu)
un vieux céléron de merde 2.6 GHz avec 256mo de ram

Voilà merci à ceux qui veulent bien m'aider.

Dernière modification par ezaeza (Le 28/02/2008, à 03:03)

Hors ligne

#2 Le 27/02/2008, à 23:59

ezaeza

Re : [C++][Résolu] comportement bizarre de thread

bon ben après encore 2 heures de recherches, on viens de me donner la réponse ailleurs big_smile , en faite il fallait mettre un pthread_yield(); après chaque tour du for pour une veille machine simple core, ça fait changer le thread ...

Hors ligne