Advertisement
Guest User

Untitled

a guest
Dec 8th, 2016
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.46 KB | None | 0 0
  1. #include <iostream>
  2. #include <semaphore.h>
  3.  
  4. sem_t canConsume;
  5. sem_t canProduce;
  6. sem_t mutex;
  7.  
  8. bool consumeFinish  = false;
  9. bool produceFinish  = false;
  10.  
  11. size_t bufferSize    = 0;
  12. unsigned int *buffer = nullptr;
  13.  
  14. unsigned int firstFreePosition = (unsigned int) bufferSize - 1;
  15.  
  16. namespace TextColor {
  17.     std::string RED_COLOR   = "\033[1;31m";
  18.     std::string GREEN_COLOR = "\033[1;32m";
  19.     std::string DEF_COLOR   = "\033[0m";
  20. }
  21.  
  22. void printBuffer() {
  23.     for (size_t i = 0; i < bufferSize; i++) {
  24.         if (buffer[i] == 0) {
  25.             std::cout << TextColor::RED_COLOR;
  26.         } else {
  27.             std::cout << TextColor::GREEN_COLOR;
  28.         }
  29.         std::cout << buffer[i] << " ";
  30.     }
  31.     std::cout << TextColor::DEF_COLOR << std::endl;
  32. }
  33.  
  34. void *produce(void *p) {
  35.     return nullptr;
  36. }
  37.  
  38. void *consume(void *p) {
  39.     return nullptr;
  40. }
  41.  
  42. int main(int argc, char *argv[]) {
  43.     int numThreadsProducers = 0, numThreadsConsumers = 0;
  44.    
  45.     // receive arguments - validate and save
  46.     if (argc != 6) {
  47.         std::cerr << TextColor::RED_COLOR << "Number of arguments invalid!" << TextColor::DEF_COLOR << std::endl;
  48.         return -1;
  49.     }
  50.  
  51.     if (atoi(argv[1])) {
  52.         bufferSize = std::stoi(argv[1]);
  53.     } else {
  54.         std::cerr << TextColor::RED_COLOR << argv[1] << ": is not valid number!" << TextColor::DEF_COLOR << std::endl;
  55.         return -1;
  56.     }
  57.  
  58.     if (atoi(argv[2])) {
  59.         numThreadsProducers = std::stoi(argv[2]);
  60.     } else {
  61.         std::cerr << TextColor::RED_COLOR << argv[2] << ": is not valid number!" << TextColor::DEF_COLOR << std::endl;
  62.         return -1;
  63.     }
  64.  
  65.     if (strcmp(argv[3], "1") == 0 || strcmp(argv[3], "true") == 0) {
  66.         produceFinish = true;
  67.     } else if (strcmp(argv[3], "0") == 0 || strcmp(argv[3], "false") != 0) {
  68.         std::cerr << TextColor::RED_COLOR << argv[3] << ": is not valid boolean!" << TextColor::DEF_COLOR << std::endl;
  69.         return -1;
  70.     }
  71.  
  72.     if (atoi(argv[4])) {
  73.         numThreadsConsumers = std::stoi(argv[4]);
  74.     } else {
  75.         std::cerr << TextColor::RED_COLOR << argv[4] << ": is not valid number!" << TextColor::DEF_COLOR << std::endl;
  76.         return -1;
  77.     }
  78.  
  79.     if (strcmp(argv[5], "1") == 0 || strcmp(argv[5], "true") == 0) {
  80.         consumeFinish = true;
  81.     } else if (strcmp(argv[5], "0") == 0 || strcmp(argv[5], "false") != 0) {
  82.         std::cerr << TextColor::RED_COLOR << argv[5] << ": is not valid boolean!" << TextColor::DEF_COLOR << std::endl;
  83.         return -1;
  84.     }
  85.  
  86.     // initialize buffer
  87.     buffer = new unsigned int[bufferSize];
  88.     buffer[bufferSize] = {0};
  89.    
  90.     // initialize semaphores
  91.     sem_init(&canProduce, 0, bufferSize - 1);
  92.     sem_init(&canConsume, 0, 0);
  93.     sem_init(&mutex, 0, 1);
  94.    
  95.     // create threads arrays
  96.     pthread_t consumersThreadsArray[numThreadsConsumers];
  97.     pthread_t producersThreadsArray[numThreadsProducers];
  98.    
  99.     // create producers threads
  100.     for (int i = 0; i < numThreadsConsumers; i++) {
  101.         pthread_create(&(producersThreadsArray[i]), NULL, produce, (void *) &i);
  102.     }
  103.    
  104.     // create consumers threads
  105.     for (int i = 0; i < numThreadsConsumers; i++) {
  106.         pthread_create(&(consumersThreadsArray[i]), NULL, consume, (void *) &i);
  107.     }
  108.    
  109.     // print buffer
  110.     printBuffer();
  111.    
  112.     // delete memory
  113.     sem_destroy(&canProduce);
  114.     sem_destroy(&canConsume);
  115.     sem_destroy(&mutex);
  116.    
  117.     delete [] buffer;
  118.    
  119.     return 0;
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement