Advertisement
Guest User

Untitled

a guest
Jun 24th, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.90 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <pthread.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <string.h>
  6.  
  7. int gold = 0;
  8.  
  9.  
  10.  
  11. pthread_mutex_t gold_mutex;
  12.  
  13. void* mine(void *arg){
  14. int index = (int)arg;
  15. int count = 0;
  16. while(count < 2){
  17. if(pthread_mutex_trylock(&gold_mutex) == 0){
  18. gold += 10;
  19. printf("Miner %d gathered 10 gold \n", index);
  20. // sleep(2);
  21. pthread_mutex_unlock(&gold_mutex);
  22. count++;
  23. }
  24. }
  25. }
  26.  
  27. void* trade(void *arg){
  28. int index = (int)arg;
  29. int count = 0;
  30. while(count < 2){
  31. if(pthread_mutex_trylock(&gold_mutex) == 0){
  32. if(gold < 10){
  33. printf("Warehouse is empty, cannot sell \n");
  34. // sleep(2);
  35. pthread_mutex_unlock(&gold_mutex);
  36. count++;
  37. continue;
  38. }
  39. gold -= 10;
  40. printf("Trader %d sold 10 gold \n", index);
  41. // sleep(2);
  42. pthread_mutex_unlock(&gold_mutex);
  43. count++;
  44.  
  45.  
  46. }
  47. }
  48. }
  49.  
  50.  
  51. int parse_cmdMaikatideba(char* argv){
  52. int res = 0;
  53. for (int i = 0; i < strlen(argv); ++i)
  54. {
  55. res*=10;
  56. res += argv[i] - '0';
  57. }
  58. return res;
  59. }
  60.  
  61. int main(int argc, char *argv[])
  62. {
  63.  
  64. int minersCounter = parse_cmdMaikatideba(argv[1]);
  65. int tradersCounter = parse_cmdMaikatideba(argv[2]);
  66.  
  67. printf("%s\n", argv[1]);
  68. printf("%s\n", argv[2]);
  69.  
  70. pthread_t miners[minersCounter];
  71. pthread_t traders[tradersCounter];
  72. for (int i = 0; i < minersCounter; ++i)
  73. {
  74. int res = pthread_create(&miners[i], NULL, mine, (void*)i);
  75. if(res != 0){
  76. exit(0);
  77. }
  78.  
  79. }
  80. for (int i = 0; i < tradersCounter; ++i)
  81. {
  82.  
  83. int res = pthread_create(&traders[i], NULL, trade, (void*)i);
  84. if(res !=0){
  85. exit(0);
  86. }
  87. }
  88.  
  89. for (int i = 0; i < minersCounter; ++i)
  90. {
  91. int res = pthread_join(miners[i], NULL);
  92. if(res != 0){
  93. exit(0);
  94. }
  95.  
  96. }
  97. for (int i = 0; i < tradersCounter; ++i)
  98. {
  99.  
  100. int res = pthread_join(traders[i], NULL);
  101. if(res != 0){
  102. exit(0);
  103. }
  104. }
  105.  
  106. printf("%d\n", gold);
  107.  
  108. return 0;
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement