Threads sous linux

5/5 (7 avis)

Vue 18 148 fois - Téléchargée 687 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
LiaGalanodel
Messages postés
19
Date d'inscription
mercredi 3 mars 2010
Statut
Membre
Dernière intervention
29 juillet 2010
1
1 avril 2010 à 17:01
Merci ;)
ckouckou83
Messages postés
5
Date d'inscription
vendredi 8 juillet 2005
Statut
Membre
Dernière intervention
6 avril 2009

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

16 sept. 2004 à 09:12
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 ?
BlackGoddess
Messages postés
338
Date d'inscription
jeudi 22 août 2002
Statut
Membre
Dernière intervention
14 juin 2005

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

13 janv. 2004 à 01:43
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.