Guest User

Untitled

a guest
Jan 3rd, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.79 KB | None | 0 0
  1. //i%2==0 reader else writer
  2. for(i=0; i<20; i++) {
  3. switch(fork()) {
  4. case 0:
  5.  
  6.  
  7.  
  8. switch(i%2) {
  9. case 0://reader
  10.  
  11. while(semctl(sem_mutex, 0, GETVAL) != 1); //wait(mutex)
  12.  
  13. if(writers > 0 || readers == 0) {
  14. semctl(sem_mutex, 0, SETVAL, 1); //signal(mutex)
  15. while(semctl(sem_resource, 0, GETVAL) != 1); //wait(mutex)
  16. while(semctl(sem_mutex, 0, GETVAL) != 1); //wait(mutex)
  17. }
  18.  
  19. readers++;
  20. semctl(sem_mutex, 0, SETVAL, 1); //signal(mutex)
  21.  
  22. for(j = 0; j<20; j++) { //reading
  23. if(j%2!=0)
  24. printf("%d %d ", getpid(), list[j]);
  25. }printf("n");
  26.  
  27. while(semctl(sem_mutex, 0, GETVAL) != 1); //wait(mutex)
  28. readers--;
  29. if(readers==0)
  30. semctl(sem_resource, 0, SETVAL, 1); //signal(resource)
  31. semctl(sem_mutex, 0, SETVAL, 1); //signal(mutex)
  32.  
  33.  
  34. break;
  35.  
  36. default://writer
  37.  
  38. while(semctl(sem_mutex, 0, GETVAL) != 1); //wait(mutex)
  39. writers++; //writers <- +1
  40. semctl(sem_mutex, 0, SETVAL, 1); //signal(mutex)
  41. while(semctl(sem_resource, 0, GETVAL) != 1); //wait(resource)
  42.  
  43. list[i] = i; //writing
  44.  
  45. while(semctl(sem_mutex, 0, GETVAL) != 1); //wait(mutex)
  46. writers--;
  47. semctl(sem_mutex, 0, SETVAL, 1); //signal(mutex)
  48. semctl(sem_resource, 0, SETVAL, 1); //signal(resource)
  49.  
  50. break;
  51.  
  52. }
  53.  
  54.  
  55.  
  56. shmdt(list);
  57.  
  58. exit(0);
  59. break;
  60.  
  61. default:
  62. break;
  63.  
  64. }
Add Comment
Please, Sign In to add comment