2 * Leandro Lucarella (77891)
4 * Ejercicio 1.1. Implementa problema del museo usando solamente variables
12 #include <sys/types.h>
17 /// Clave de nuestro segmento shm y semaforo
18 #define SHM_KEY 0x77891120
19 #define SEM_KEY 0x77891121
21 /// Ahora el contador es un simple unsigned
22 typedef unsigned Molinete;
24 /// Union para utilizar semaforo
29 unsigned short* array;
32 int main(int argc, char *argv[])
39 cerr << "Faltan parametros: " << argv[0] << " N [max_iter]\n";
42 int proc = atoi(argv[1]);
45 int shm_id = shmget(SHM_KEY, sizeof(Molinete), IPC_CREAT | 0666);
48 cerr << "Error al crea/obtener shared memory.\n";
51 Molinete* molinete = (Molinete*) shmat(shm_id, NULL, 0);
52 if (molinete == (Molinete*) -1)
54 cerr << "Error al attachear shared memory.\n";
57 cout << "Shared memory id = " << shm_id << "\n";
60 int sem_id = semget(SEM_KEY, 1, 0666 | IPC_CREAT);
63 cerr << "Error al crea/obtener semaforo.\n";
68 if (semctl(sem_id, 0, SETVAL, sem_arg) < 0)
70 cerr << "No se pudo inicializar semaforo.\n";
74 ops.sem_op = 1; // agregar 1
75 ops.sem_num = 0; // al semaforo 1
76 ops.sem_flg = 0; // esperando
77 if (semop(sem_id, &ops, 1) < 0)
79 cerr << "No se pudo agregar al semaforo.\n";
82 cout << "Semaforo inicializado id = " << sem_id << "\n";
84 // Si somos el primer proceso inicializamos el molinete
85 if (!proc) *molinete = 0;
87 // Maxima cantidad de iteraciones (puede venir por parametro)
88 int max_iter = 100000;
90 max_iter = atoi(argv[2]);
93 for (int i = 0; i < max_iter; ++i)
95 bool dec = rand() % 2;
98 ops.sem_op = -1; // saco 1 (== adquirir el mutex)
99 if (semop(sem_id, &ops, 1) < 0)
101 cerr << "No se pudo sacar al semaforo.\n";
104 if (dec && molinete) // Decremento sólo si no es 0
109 ops.sem_op = 1; // pongo 1 (== liberar el mutex)
110 if (semop(sem_id, &ops, 1) < 0)
112 cerr << "No se pudo sacar al semaforo.\n";
115 // Uso cout directamente porque es line-buffered, mientras que
116 // no use threads no es problema el buffer de cout. Y de todas
117 // formas pongo un flush (el endl es \n+flush) por las dudas.
118 cout << "Proceso " << proc << ": molinete = " << count << std::endl;
119 //sched_yield(); // Para ver como se entrelazan mejor
122 if (shmdt(molinete) == -1)
124 cerr << "Error al detachear shared memory.\n";