¿Cómo utilizar los semáforos proporcionados por Linux para lograr la exclusión mutua y la sincronización de procesos?
#include
#include
#include
#include
#include
#include
#include
#include
#define N 3
pthread_mutex_t mutex_w,mutex_r; /Escribir mutex
sem_t sem_w,sem_r;
int data[N];
int pos=0;
void *function_w (void *arg)
{
int w = *(int *)arg
pos = w
while( 1)
{
usleep(100000);
sem_wait (&sem_w);//esperar un recurso grabable
pthread_mutex_lock( &mutex_w);//prohibir que otro hilo escriba este recurso
data[pos] = w
w++;
w++;
w++;
w++;
pos++;
pos=pos%N;
pthread_mutex_unlock(&mutex_w);// Otros hilos puede escribir en este recurso
sem_post(&sem_r); // Liberar el recurso leído
}
return (void *)0;
}
void *function_r(void *arg)
{
while(1)
{
sem_wait(&sem_r);//Esperar recursos legibles
pthread_mutex_lock(&mutex_r);//Prohibir que otros hilos lean este recurso
printf("%d\n ", data[(pos+N-1)%N]);
pthread_mutex_unlock(&mutex_r); // Otro hilo puede leer este recurso
sem_post(&sem_w); escribir recurso
}
return (void *)0
}
int main(int argc, char **argv)
{
pthread_t hilo[2*N];
int i
pthread_mutex_init(&mutex_w,NULL) ;
pthread_mutex_init(&mutex
_r,NULL);
sem_init(&sem_w,0,N
sem_init(&sem_r,0,0);
para(i=0; i { if ( pthread_create(&thread [i],NULL,function_w,(void *)&i) < 0)//Crear una escritura hilo { perror("pthread_create"); exit(-1); } } for( i=N; i<2*N;i++) { if ( pthread_create(&thread[i],NULL,function_r , NULL) <0)//crear hilo de lectura { perror("pthread_ create"); exit(-1); p > } } dormir(1); regresar(0); }