Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <semaphore.h>
- #include <pthread.h>
- sem_t canConsume;
- sem_t canProduce;
- sem_t mutex;
- bool consumeFinish = false;
- bool produceFinish = false;
- size_t bufferSize = 0;
- unsigned int *buffer = nullptr;
- unsigned int firstFreePosition = (unsigned int) bufferSize - 1;
- namespace TextColor {
- const std::string RED_COLOR = "\033[1;31m";
- const std::string GREEN_COLOR = "\033[1;32m";
- const std::string YELLOW_COLOR = "\033[1;33m";
- const std::string DEF_COLOR = "\033[0m";
- }
- void printBuffer() {
- std::cout << TextColor::YELLOW_COLOR << "Buffer: ";
- for (size_t i = 0; i < bufferSize; i++) {
- if (buffer[i] == 0) {
- std::cout << TextColor::RED_COLOR;
- } else {
- std::cout << TextColor::GREEN_COLOR;
- }
- std::cout << buffer[i] << " ";
- }
- std::cout << TextColor::DEF_COLOR << std::endl;
- }
- void *produce(void *p) {
- std::cout << "produce" << std::endl;
- return nullptr;
- }
- void *consume(void *p) {
- std::cout << "consume" << std::endl;
- return nullptr;
- }
- int main(int argc, char *argv[]) {
- int numThreadsProducers = 0, numThreadsConsumers = 0;
- // receive arguments - validate and save
- if (argc != 6) {
- std::cerr << TextColor::RED_COLOR << "Number of arguments invalid!" << TextColor::DEF_COLOR << std::endl;
- return -1;
- }
- if (atoi(argv[1])) {
- bufferSize = std::stoi(argv[1]);
- } else {
- std::cerr << TextColor::RED_COLOR << argv[1] << ": is not valid number!" << TextColor::DEF_COLOR << std::endl;
- return -1;
- }
- if (atoi(argv[2])) {
- numThreadsProducers = std::stoi(argv[2]);
- } else {
- std::cerr << TextColor::RED_COLOR << argv[2] << ": is not valid number!" << TextColor::DEF_COLOR << std::endl;
- return -1;
- }
- if (strcmp(argv[3], "1") == 0 || strcmp(argv[3], "true") == 0) {
- produceFinish = true;
- } else if (strcmp(argv[3], "0") == 0 || strcmp(argv[3], "false") != 0) {
- std::cerr << TextColor::RED_COLOR << argv[3] << ": is not valid boolean!" << TextColor::DEF_COLOR << std::endl;
- return -1;
- }
- if (atoi(argv[4])) {
- numThreadsConsumers = std::stoi(argv[4]);
- } else {
- std::cerr << TextColor::RED_COLOR << argv[4] << ": is not valid number!" << TextColor::DEF_COLOR << std::endl;
- return -1;
- }
- if (strcmp(argv[5], "1") == 0 || strcmp(argv[5], "true") == 0) {
- consumeFinish = true;
- } else if (strcmp(argv[5], "0") == 0 || strcmp(argv[5], "false") != 0) {
- std::cerr << TextColor::RED_COLOR << argv[5] << ": is not valid boolean!" << TextColor::DEF_COLOR << std::endl;
- return -1;
- }
- // initialize buffer
- buffer = new unsigned int[bufferSize];
- for (int i = 0; i < bufferSize; i++) {
- buffer[i] = 0;
- }
- // initialize semaphores
- sem_init(&canProduce, 0, bufferSize - 1);
- sem_init(&canConsume, 0, 0);
- sem_init(&mutex, 0, 1);
- // create threads arrays
- pthread_t *consumersThreadsArray = new pthread_t[numThreadsConsumers];
- pthread_t *producersThreadsArray = new pthread_t[numThreadsProducers];
- // create producers threads
- for (int i = 0; i < numThreadsProducers; i++) {
- pthread_create(&(producersThreadsArray[i]), NULL, produce, (void *) &i);
- }
- // create consumers threads
- for (int i = 0; i < numThreadsConsumers; i++) {
- pthread_create(&(consumersThreadsArray[i]), NULL, consume, (void *) &i);
- }
- // threads join
- if (produceFinish == true) {
- for (int i = 0; i < numThreadsProducers; i++) {
- pthread_join(producersThreadsArray[i], nullptr);
- }
- }
- if (consumeFinish == true) {
- for (int i = 0; i < numThreadsConsumers; i++) {
- pthread_join(consumersThreadsArray[i], nullptr);
- }
- }
- // print buffer
- //printBuffer();
- // delete memory
- sem_destroy(&canProduce);
- sem_destroy(&canConsume);
- sem_destroy(&mutex);
- delete [] buffer;
- delete [] consumersThreadsArray;
- delete [] producersThreadsArray;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement