1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
   | #include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <semaphore.h>
#define MAX 100
 
sem_t mutex, vide, plein;
char tampon[MAX];
pthread_t tid[2];
 
/* Médinoc: On remplace "i" par un nom plus explicite */
void* proc(void* pv);
 
int main()
{
	int i;
 
	sem_init(&mutex, 0, 1);
	sem_init(&vide, 0, MAX);
	sem_init(&plein, 0, 0);
 
	/* Médinoc:
		Normalement, Le premier cast est inutile.
		Si ça refuse, c'est que les fonctions sont mal déclarées
 
	for(i = 0; i<2; i++)
		pthread_create(tid + i, NULL, (void*(*)())proc, (void*) i );
	*/
	for(i = 0; i<2; i++)
		pthread_create(tid + i, NULL, proc, (void*) i );
 
	/* Médinoc:
		La segfault est sans doute ici.
		Puisque tu te moques de la valeur de retour, autant passer NULL.
	for(i = 0; i<2; i++)
		pthread_join(tid[i], (void*)i);
	*/
	for(i = 0; i<2; i++)
		pthread_join(tid[i], NULL);
 
	return 0;
}
 
 
/* Médinoc: On remplace "i" par un nom plus explicite */
void* proc(void* pv)
{
	/* Médinoc: On met i à l'intérieur: un vrai entier à présent */
	int const i = (int)pv;
 
	int rep;
	int positionLecteur = 0;
	int positionEcrivain = 0;
 
	/* Médinoc:
		Le read() et le write() prètent à confusion, sans commentaires
		*/
 
	if(i==0)
	{ // thread Lecteur
		do
		{
			sem_wait(&plein);
			sem_wait(&mutex);
 
			/* Lit un caractère du buffer et l'envoit sur la sortie
			Médinoc:
				Il doit manquer un truc, ici...
				posotionLecteur n'est jamais augmenté...
			 */
			rep = write(STDOUT_FILENO, &tampon[positionLecteur], 1);
 
			sem_post(&mutex);
			sem_post(&vide);
		}while( rep != 0);
		/* Médinoc: Tu avais oublié un }, ici */
	}
	else
	{ // thread ecrivain
		do
		{
			sem_wait(&vide);
			sem_wait(&mutex);
 
			/* Reçoit le un caractère de l'entrée et l'écrit dans le buffer
			Médinoc:
				Il doit manquer un truc, ici...
				positionEcrivain n'est jamais augmenté...
			 */
			rep = read(STDIN_FILENO, &tampon[positionEcrivain], 1);
 
			sem_post(&mutex);
			sem_post(&plein);
		}while( rep != 0) ;
	}
	return NULL;
} | 
Partager