Threads sous linux

Soyez le premier à donner votre avis sur cette source.

Vue 17 822 fois - Téléchargée 683 fois

Description

Ce code montre très simplement comment utiliser des threads sous linux.
Pour compiler la source, il faut linker avec la librairie "pthread" soit :
g++ thread.cpp -o thread -lpthread
Vous pouvez utiliser gcc mais dans ce cas, il faut remplacer le "new char" par un "malloc"...

Mise à jour le 13/01/04 :
Rajout de l'utilisation de mutex et de pthread_join. Avis aux amateurs ;)
Rajout de la source en zip.

Source / Exemple :


#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>	// pour sleep
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

// mutex => MUtuelle EXclusion (permet d'éviter un accès simultané à une variable)
static pthread_mutex_t mutex; 
static int tab[5];

void* threadLectureTableau(void* arg)
{
	for (int i = 0 ; i != 5 ; i++)
	{
		// blocage du mutex
		// (attente éventuelle de sa libération s'il est déjà bloqué)
		pthread_mutex_lock (&mutex);

		printf ("Lecture du tableau 1 : tab[%d] vaut %d\\n", i, tab[i]);

		// déblocage du mutex
		pthread_mutex_unlock (&mutex);

		sleep(1);
	}

	pthread_exit (0);
}

void* threadLectureTableau2(void* arg)
{
	for (int i = 0 ; i != 5 ; i++)
	{
		// blocage du mutex
		// (attente éventuelle de sa libération s'il est déjà bloqué)
		pthread_mutex_lock (&mutex);

		printf ("Lecture du tableau 2 : tab[%d] vaut %d\\n", i, tab[i]);

		// déblocage du mutex
		pthread_mutex_unlock (&mutex);

		sleep(2);
	}

	pthread_exit (0);
}

void* threadEcritureTableau(void* arg)
{
	// blocage du mutex
	// (attente éventuelle de sa libération s'il est déjà bloqué)
	pthread_mutex_lock (&mutex);

	for (int i = 0 ; i != 5 ; i++)
	{
		tab[i] = 2 * i;
		printf ("Ecriture du tableau : tab[%d] vaut %d\\n", i, tab[i]);
		sleep(1);
	}

	// déblocage du mutex
	pthread_mutex_unlock (&mutex);

	pthread_exit (0);
}

int main(int argc, char *argv[])
{
	pthread_t thread1, thread2, thread3;
	void *retour;

	pthread_mutex_init (&mutex, NULL);

	if (pthread_create (&thread1, NULL, threadEcritureTableau, NULL) < 0)
	{
		fprintf (stderr, "Impossible de créer le thread 1\\n");
		exit (1);
	}

	if (pthread_create (&thread2, NULL, threadLectureTableau, NULL) < 0)
	{
		fprintf (stderr, "Impossible de créer le thread 2\\n");
		exit (1);
	}

	if (pthread_create (&thread3, NULL, threadLectureTableau2, NULL) < 0)
	{
		fprintf (stderr, "Impossible de créer le thread 2\\n");
		exit (1);
	}

                // le processus principale est ainsi contraint d'attendre la fin d'exécution
                // des threads fils
	(void)pthread_join (thread1, &retour);
	(void)pthread_join (thread2, &retour);
	(void)pthread_join (thread3, &retour);
}

Conclusion :


Voilà, j'ai étoffé un peu le code, à la demande de certains, montrant ainsi une nouvelle notion très importante dans la gestion en temps réel, les mutex.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
19
Date d'inscription
mercredi 3 mars 2010
Statut
Membre
Dernière intervention
29 juillet 2010
1
Merci ;)
Messages postés
5
Date d'inscription
vendredi 8 juillet 2005
Statut
Membre
Dernière intervention
6 avril 2009

Il manque le fichier thread.h
Messages postés
17
Date d'inscription
samedi 15 mars 2003
Statut
Membre
Dernière intervention
29 avril 2008

Intéressant, en BTS IRIS les profs ne nous fait voir que les threads sour windows en nous disant que sous linux ça fonctionnait dans le même esprit.
L'exemple que tu donne confirme et en plus sa structure ressemble en gros à ce que j'avais pu voir.
Mais au niveau des évenements, comment ca marche sous linux ?
Messages postés
338
Date d'inscription
jeudi 22 août 2002
Statut
Membre
Dernière intervention
14 juin 2005

(pour ceux qui veulent du multithreading portable en c++, cf boost::thread www.boost.org)
Messages postés
49
Date d'inscription
mercredi 12 février 2003
Statut
Membre
Dernière intervention
5 septembre 2006

Voilà, j'ai étoffé un peu le code, montrant en plus une nouvelle notion très importante dans la gestion en temps réel, les mutex.

@bientôt et n'hésitez pas pour d'éventuelles questions...
Jérôme.
Afficher les 7 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.