Advertisement
Guest User

Untitled

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