Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <windows.h>
- #include <stdio.h>
- #include <stdlib.h>
- #define EAT_MAX 1000
- #define PHILLOSOFERS 5
- #define STICKS 5
- #define MIN_STICKS_TO_EAT 2
- int availableSticks[STICKS] ;
- //CRITICAL_SECTION canPickUp;
- CRITICAL_SECTION sticks[STICKS];
- int pickup(int i);
- void putDown(int i);
- DWORD WINAPI phillosofer(LPVOID LPARAM);
- int main()
- {
- HANDLE WINAPI handleArr[PHILLOSOFERS];
- int id[PHILLOSOFERS];
- //InitializeCriticalSection(&canPickUp);
- for (int i = 0; i < STICKS; i++)
- {
- availableSticks[i] = 1;
- InitializeCriticalSection(&sticks[i]);
- }
- for (int i = 0; i < PHILLOSOFERS; i++)
- {
- id[i] = i;
- handleArr[i] = CreateThread(NULL, 0, phillosofer, &id[i], 0, NULL);
- }
- for (int i = 0; i < PHILLOSOFERS; i++)
- {
- WaitForSingleObject(handleArr[i], INFINITE);
- }
- system("pause");
- return 0;
- }
- DWORD WINAPI phillosofer(LPVOID lparam)
- {
- int count = 0;
- int cur = *(int*)lparam;
- printf("%d STARTED\n", *(int*)lparam);
- while (count <= EAT_MAX)
- {
- if (pickup(*(int*)lparam))
- {
- count++;
- printf("%d",*(int*)lparam);
- putDown(*(int*)lparam);
- }
- }
- printf("%d DONE\n", *(int*)lparam);
- return NULL;
- }
- int pickup(int i)
- {
- if (TryEnterCriticalSection(&sticks[i]) && TryEnterCriticalSection(&sticks[(i + 1) % STICKS]))
- {
- return 1;
- //both avaiable
- }
- else
- {
- //if only one is avaiable dont take any
- LeaveCriticalSection(&sticks[(i + 1) % STICKS]);
- LeaveCriticalSection(&sticks[i]);
- }
- return 0;
- }
- void putDown(int i)
- {
- LeaveCriticalSection(&sticks[i]);
- LeaveCriticalSection(&sticks[(i + 1) % STICKS]);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement