Advertisement
d1cor

posix_semaphore_thread.c

Nov 1st, 2017
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.77 KB | None | 0 0
  1. /*******************************************
  2. * Author     : Diego Cordoba / @d1cor      *
  3. * Purpose    : juncotic.com  / um.edu.ar   *
  4. *******************************************/
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <unistd.h>
  9. #include <string.h>
  10. #include <fcntl.h>
  11. #include <sys/shm.h>
  12. #include <sys/stat.h>
  13. #include <sys/mman.h>
  14. #include <sys/types.h>
  15. #include <errno.h>
  16. #include <semaphore.h>
  17. #include <wait.h>
  18. #include <pthread.h>
  19.  
  20.  
  21. #define SEM_NAME "/sema"
  22.  
  23. void * funcion(void *p);
  24.  
  25. int main(int argc, char ** argv){
  26.     int i;
  27.     int valor;
  28.     sem_t mutex;
  29.     pthread_t tid; 
  30.  
  31.  
  32.     sem_init(&mutex,0,1);
  33.  
  34.  
  35.     sem_getvalue(&mutex, &valor); printf("Valor actual: %d\n", valor);
  36.     if(pthread_create(&tid, NULL, funcion, (void*)&mutex)){
  37.         printf("\n ERROR creating thread 1");
  38.         exit(1);
  39.     }
  40.  
  41.    
  42.  
  43.     //padre
  44.     for(i=0;i<3;i++){
  45.         sem_wait(&mutex);
  46.         sem_getvalue(&mutex, &valor); printf("Valor actual: %d (padre adentro)\n", valor);
  47.    
  48.         printf("Padre usando recurso...\n");
  49.         sleep(2);
  50.         printf("Padre liberando recurso \n\n");
  51.        
  52.         sem_post(&mutex);
  53.         sem_getvalue(&mutex, &valor); printf("Valor actual: %d (padre saliendo)\n", valor);
  54.         usleep(100+i*10);
  55.     }
  56.    
  57.     if(pthread_join(tid, NULL)){
  58.         printf("\n ERROR joining thread");
  59.         exit(1);
  60.     }
  61.    
  62.     // cierra el semaforo
  63.     sem_close(&mutex);
  64.  
  65.     return (0);
  66. }
  67.  
  68.  
  69. void * funcion(void *p){
  70.     int i, valor;
  71.     sem_t *mutex = (sem_t*)p;
  72.    
  73.     for(i=0;i<3;i++){
  74.         sem_wait(mutex); //baja
  75.         sem_getvalue(mutex, &valor); printf("Valor actual: %d (hijo adentro)\n", valor);
  76.  
  77.         printf("Hijo usando recurso...\n");
  78.         sleep(1);
  79.         printf("Hijo liberando recurso \n\n");
  80.    
  81.         sem_post(mutex); //sube
  82.         sem_getvalue(mutex, &valor); printf("Valor actual: %d (hijo saliendo)\n", valor);
  83.         usleep(100-i*10);
  84.     }
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement