source: trunk/fork-pc.c @ 2

Last change on this file since 2 was 2, checked in by Mattia Monga, 9 years ago

Importazione sorgenti

File size: 1.4 KB
Line 
1/* Copyright (C) 2008 by Mattia Monga <mattia.monga@unimi.it> */
2/* $Id$ */
3#include <pthread.h>
4#include <stdio.h>
5#include <stdlib.h>
6#include <sys/wait.h>
7
8void b_insert(char*);
9void b_remove(char**);
10
11
12void producer(void)
13{ 
14  while (1){
15    char* o = (char*)malloc(sizeof(char));
16    printf("Ho prodotto %x\n", o);
17    b_insert(o);
18  }
19}
20
21void consumer(void)
22{ 
23  while (1){
24    char* o;
25    b_remove(&o);
26    free(o);
27    printf("Ho consumato %x\n", o);
28  }
29}
30
31int main(void){
32
33  int p, c;
34 
35  p = fork();
36  if (p == 0) producer();
37  c = fork();
38  if (c == 0) consumer();
39 
40  waitpid(-1, NULL, 0);
41
42  return 0;
43}
44
45#define N 10
46char* buffer[N];
47int count = 0;
48
49pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
50pthread_cond_t full = PTHREAD_COND_INITIALIZER;
51pthread_cond_t empty = PTHREAD_COND_INITIALIZER;
52
53void b_insert(char* o)
54{
55  pthread_mutex_lock(&lock);
56
57  if (count == N) pthread_cond_wait(&full, &lock);
58  buffer[count++] = o;
59  if (count == 1) pthread_cond_signal(&empty);
60
61  pthread_mutex_unlock(&lock);
62}
63
64/* passaggio per indirizzo per evitare di fare la return fuori dai lock */
65void b_remove(char** result)
66{
67  pthread_mutex_lock(&lock);
68
69  if (count == 0) pthread_cond_wait(&empty, &lock);
70  *result = buffer[--count];
71  if (count == N-1) pthread_cond_signal(&full);
72
73  pthread_mutex_unlock(&lock);
74}
75
76
77/* Local Variables: */
78/* compile-command: "make -k " */
79/* End: */
80
81
Note: See TracBrowser for help on using the repository browser.