Advertisement
Guest User

Untitled

a guest
Jan 18th, 2020
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.61 KB | None | 0 0
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #define EAT_MAX 1000
  5. #define PHILLOSOFERS 5
  6. #define STICKS 5
  7. #define MIN_STICKS_TO_EAT 2
  8. int availableSticks[STICKS] ;
  9.  
  10. //CRITICAL_SECTION canPickUp;
  11. CRITICAL_SECTION sticks[STICKS];
  12.  
  13. int pickup(int i);
  14. void putDown(int i);
  15.  
  16. DWORD WINAPI phillosofer(LPVOID LPARAM);
  17.  
  18. int main()
  19. {
  20.     HANDLE WINAPI handleArr[PHILLOSOFERS];
  21.     int id[PHILLOSOFERS];
  22.     //InitializeCriticalSection(&canPickUp);
  23.     for (int i = 0; i < STICKS; i++)
  24.     {
  25.         availableSticks[i] = 1;
  26.         InitializeCriticalSection(&sticks[i]);
  27.  
  28.     }
  29.     for (int i = 0; i < PHILLOSOFERS; i++)
  30.     {
  31.         id[i] = i;
  32.         handleArr[i] = CreateThread(NULL, 0, phillosofer, &id[i], 0, NULL);
  33.     }
  34.     for (int i = 0; i < PHILLOSOFERS; i++)
  35.     {
  36.         WaitForSingleObject(handleArr[i], INFINITE);
  37.     }
  38.     system("pause");
  39.     return 0;
  40. }
  41.  
  42. DWORD WINAPI phillosofer(LPVOID lparam)
  43. {
  44.     int count = 0;
  45.     int cur = *(int*)lparam;
  46.     printf("%d STARTED\n", *(int*)lparam);
  47.     while (count <= EAT_MAX)
  48.     {
  49.  
  50.             if (pickup(*(int*)lparam))
  51.             {
  52.                 count++;
  53.                 printf("%d",*(int*)lparam);
  54.                 putDown(*(int*)lparam);
  55.             }
  56.            
  57.  
  58.     }
  59.     printf("%d DONE\n", *(int*)lparam);
  60.     return NULL;
  61. }
  62.  
  63. int pickup(int i)
  64. {
  65.     if (TryEnterCriticalSection(&sticks[i]) && TryEnterCriticalSection(&sticks[(i + 1) % STICKS]))
  66.     {
  67.         return 1;
  68.         //both avaiable
  69.     }
  70.     else
  71.     {
  72.         //if only one is avaiable dont take any    
  73.             LeaveCriticalSection(&sticks[(i + 1) % STICKS]);
  74.             LeaveCriticalSection(&sticks[i]);  
  75.     }
  76.    
  77.  
  78.    
  79.     return 0;
  80. }
  81. void putDown(int i)
  82. {
  83.     LeaveCriticalSection(&sticks[i]);
  84.     LeaveCriticalSection(&sticks[(i + 1) % STICKS]);
  85.    
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement