-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathclaseSemaforos.c
107 lines (83 loc) · 2.13 KB
/
claseSemaforos.c
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
98
99
100
101
102
103
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
void * consumidor(void*);
void * productor(void*);
int secCrit;
int idSem;
void cierre(int numSem){
struct sembuf sops;
sops.sem_num=numSem;//numero del semaforo
sops.sem_op=-1;//operacion
sops.sem_flg=SEM_UNDO;//máscara de bits
semop(idSem,&sops,1);//nsops es el numero de operaciones
}
void apertura(int numSem){
struct sembuf sops;
sops.sem_num=numSem;//numero del semaforo
sops.sem_op=1;//operacion
sops.sem_flg=SEM_UNDO;//máscara de bits
semop(idSem,&sops,1);//nsops es el numero de operaciones
}
int main(){
pthread_t hilos[2];
int prod = pthread_create(&hilos[0], NULL, productor, NULL);
int cons = pthread_create(&hilos[1], NULL, consumidor, NULL);
if((prod==-1)||(cons==-1)){
printf("\nError al crear los hilos");
exit(1);
}
pthread_join(hilos[0],NULL);
pthread_join(hilos[1],NULL);
semctl(idSem,0,IPC_RMID,0);
semctl(idSem,1,IPC_RMID,0);
}
void * productor(void* cosa1){
//paso 0:creación de la llave
key_t lallave =ftok("/home/Desktop/redes2",'b');//path a un archivo
//paso1:creación del mec de sincronización
idSem = semget(lallave,2,0666 | IPC_CREAT | IPC_EXCL);//tarea
if(idSem==-1){
//ligado al semáforo
idSem = semget(lallave,2,0666);
if(idSem==-1){
printf("\nError en ligarse");
exit(1);
}
}
else{
//inicialización del semáforo
semctl(idSem,0,SETVAL,1);
semctl(idSem,1,SETVAL,0);
}
for(int i=0;i<20;i++){//producciones en la sección crítica
cierre(0);
secCrit=i;
apertura(1);
}
//solamente una vez se debe crear e inicializar el mecanismo de sincronización
}
void * consumidor(void * cosa2){
key_t lallave = ftok("/home/Desktop/redes2",'b');
idSem =semget(lallave,2,0666 | IPC_CREAT | IPC_EXCL);
if(idSem==-1){
idSem = semget(lallave,2,0666);
if(idSem==-1){
printf("\nError en ligarse");
exit(1);
}
else{
semctl(idSem,0,SETVAL,1);
semctl(idSem,1,SETVAL,0);
}
}
for(int i=0;i<20;i++){//consumos en la sección crítica
cierre(1);
printf("\nconsumos: %d",secCrit);
apertura(0);
}
}
//tarea buscar tipos de errores de semget