Advertisement
Caio_25

Bar

Jun 14th, 2019
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.45 KB | None | 0 0
  1. #include<Windows.h>
  2. #include<process.h>
  3. #include<stdio.h>
  4. #include<stdlib.h>
  5. #include<time.h>
  6. #include<iostream>
  7. #include<vector>
  8.  
  9. using namespace std;
  10.  
  11. #define r 80//número de rodadas
  12. #define x 4//número de garçons
  13. #define c 36//número de clientes
  14. #define k 4//capacidade dos garçons
  15.  
  16. typedef struct{
  17.     bool clienteEsperaPedido;
  18.     int id;
  19. }parametroCliente;
  20.  
  21. typedef struct{
  22.     int id;
  23. }parametroGarcon;
  24.  
  25. HANDLE mutexGarcon[x];
  26. HANDLE mutexVideo;
  27. HANDLE mutexRodada;
  28. HANDLE eventCliente[c];
  29.  
  30.  
  31. int numeroPedidos[x] = {0};
  32. int matrizCliente[x][k]; // gardar os ids dos clientes que pediram para determinado garcon
  33. int topo[x] = {0};
  34. int rodadas = 0;
  35.  
  36. void CriarThreadsClientes(HANDLE idThread[], parametroCliente parametro[], DWORD ThreadIdentifier[]);
  37. void CriarThreadsGarcon(HANDLE idThread[], parametroGarcon parametro[], DWORD ThreadIdentifier[]);
  38. void IniciarThreads(HANDLE idThread[], int n);
  39. void FecharThread(HANDLE idThread[], int n);
  40. void criarMutex();
  41. void criarEvent();
  42. void fazPedido(parametroCliente *par);
  43. void esperaPedido(int id);
  44. void recebePedido(bool *clienteEspera);
  45. void cliente(void *parametro);
  46. void recebePedidoMaximo(int idgarcon);
  47. void registraPedido(int idgarcon);
  48. void entregaPedido(int idgarcon);
  49. void garcon(void *parametro);
  50. bool fechoubar();
  51.  
  52.  
  53. int main()
  54. {
  55.     srand(time(NULL));
  56.  
  57.     DWORD clienteIdentifier[c];
  58.     HANDLE idCliente[c];
  59.     parametroCliente parCli[c];
  60.  
  61.  
  62.     DWORD garconIdentifier[x];
  63.     HANDLE idGarcon[x];
  64.     parametroGarcon parGar[x];
  65.  
  66.     criarMutex();
  67.     criarEvent();
  68.  
  69.     printf("Criando threads clientes\n");
  70.     CriarThreadsClientes(idCliente, parCli, clienteIdentifier);
  71.  
  72.     printf("Criando threads Garcom\n");
  73.     CriarThreadsGarcon(idGarcon, parGar, garconIdentifier);
  74.  
  75.     IniciarThreads(idCliente, c);
  76.     IniciarThreads(idGarcon, x);
  77.  
  78.     WaitForMultipleObjects(c, idCliente, TRUE, INFINITE);
  79.     WaitForMultipleObjects(x, idGarcon, TRUE, INFINITE);
  80.  
  81.     FecharThread(idCliente, c);
  82.     FecharThread(idGarcon, x);
  83.  
  84.  
  85.     return 0;
  86. }
  87.  
  88.  
  89. void CriarThreadsClientes(HANDLE idThread[], parametroCliente parametro[], DWORD ThreadIdentifier[])
  90. {
  91.     for(int i = 0; i < c; i++)
  92.     {
  93.         parametro[i].id = i;
  94.         idThread[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)cliente, &parametro[i], CREATE_SUSPENDED, &ThreadIdentifier[i]);
  95.  
  96.     }
  97. }
  98.  
  99. void CriarThreadsGarcon(HANDLE idThread[], parametroGarcon parametro[], DWORD ThreadIdentifier[])
  100. {
  101.     for(int i = 0; i < x; i++)
  102.     {
  103.         parametro[i].id = i;
  104.         idThread[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)garcon, &parametro[i], CREATE_SUSPENDED, &ThreadIdentifier[i]);
  105.  
  106.     }
  107. }
  108.  
  109. void IniciarThreads(HANDLE idThread[], int n)
  110. {
  111.         for(int i = 0; i < n; i++)
  112.         {
  113.             ResumeThread(idThread[i]);
  114.         }
  115. }
  116.  
  117. void FecharThread(HANDLE idThread[], int n)
  118. {
  119.     for(int i = 0; i < n; i++)
  120.     {
  121.  
  122.         CloseHandle(idThread[i]);
  123.  
  124.     }
  125. }
  126.  
  127.  
  128. void criarMutex()
  129. {
  130.     mutexVideo = CreateMutex(NULL, FALSE, NULL);
  131.     mutexRodada = CreateMutex(NULL, FALSE, NULL);
  132.  
  133.  
  134.     for(int i = 0; i < x; i++)
  135.     {
  136.  
  137.         mutexGarcon[i]= CreateMutex(NULL, FALSE, NULL);
  138.     }
  139. }
  140.  
  141. void criarEvent()
  142. {
  143.     for(int i = 0; i < c; i++)
  144.     {
  145.          eventCliente[i] = CreateEvent(NULL, TRUE, FALSE, NULL);
  146.     }
  147.  
  148.  
  149. }
  150.  
  151. void fazPedido(parametroCliente *par)
  152. {
  153.  
  154.     int gar;
  155.  
  156.     WaitForSingleObject(mutexRodada, INFINITE);
  157.         do{
  158.             gar = rand() % x;
  159.         }while(topo[gar] < k);
  160.     ReleaseMutex(mutexRodada);
  161.  
  162.     WaitForSingleObject(mutexVideo, INFINITE);
  163.         cout << "Cliente " << par->id <<  " faz pedido" << endl << endl;
  164.     ReleaseMutex(mutexVideo);
  165.  
  166.     WaitForSingleObject(mutexGarcon[gar], INFINITE); //Apenas um cliente pede por vez a um único garçom
  167.         numeroPedidos[gar] += 1;
  168.         matrizCliente[gar][topo[gar]] = par->id;
  169.         topo[gar] += 1;
  170.         par->clienteEsperaPedido = true;
  171.     ReleaseMutex(mutexGarcon[gar]);
  172.  
  173.  
  174.  
  175. }
  176.  
  177. void esperaPedido(int id)
  178. {
  179.     WaitForSingleObject(eventCliente[id], INFINITE);
  180. }
  181.  
  182. void recebePedido(bool *clienteEspera)
  183. {
  184.     *clienteEspera = false;
  185. }
  186.  
  187. void consomePedido()
  188. {
  189.  
  190.     Sleep(500 + rand() % 500);
  191. }
  192.  
  193. void cliente(void *parametro)
  194. {
  195.     parametroCliente *par = (parametroCliente *) parametro;
  196.  
  197.     while(!fechoubar())
  198.     {
  199.         fazPedido(par);
  200.         esperaPedido(par->id);
  201.         recebePedido(&(par->clienteEsperaPedido));
  202.         consomePedido();
  203.     }
  204.  
  205. }
  206.  
  207. void recebePedidoMaximo(int idgarcon)
  208. {
  209.  
  210.     while(numeroPedidos[idgarcon] <= k)
  211.     {
  212.  
  213.     }
  214. }
  215.  
  216. void registraPedido(int idgarcon)
  217. {
  218.     WaitForSingleObject(mutexGarcon[idgarcon], INFINITE); // por enquanto ninguem mais pede a este garcon
  219.  
  220.  
  221. }
  222.  
  223. void entregaPedido(int idgarcon)
  224. {
  225.     for(int i = 0; i < k ; i++)
  226.     {
  227.         PulseEvent(eventCliente[matrizCliente[idgarcon][i]]);
  228.         numeroPedidos[idgarcon] -= 1;
  229.         topo[idgarcon] -= 1;
  230.     }
  231.  
  232.     ReleaseMutex(mutexGarcon[idgarcon]);
  233.  
  234. }
  235.  
  236. void garcon(void *parametro)
  237. {
  238.     parametroGarcon *par = (parametroGarcon *) parametro;
  239.  
  240.     while(!fechoubar())
  241.     {
  242.         recebePedidoMaximo(par->id);
  243.         registraPedido(par->id);
  244.         entregaPedido(par->id);
  245.  
  246.         WaitForSingleObject(mutexRodada, INFINITE);
  247.             rodadas++;
  248.         ReleaseMutex(mutexRodada);
  249.     }
  250. }
  251.  
  252. bool fechoubar()
  253. {
  254.     if(rodadas < r)
  255.     {
  256.  
  257.         return(false);
  258.     }
  259.  
  260.     else
  261.     {
  262.         return(true);
  263.     }
  264. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement