Created
August 31, 2016 11:37
-
-
Save alexandruc/ff3fbb52fdd46e482ac5d6b3433a544c to your computer and use it in GitHub Desktop.
pthread producer-consumer
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <pthread.h> | |
bool bEnd = false; | |
pthread_cond_t cv; | |
pthread_mutex_t mp; | |
bool bDataReady = false; | |
bool bProcessed = false; | |
void* perform_work(void* argument) { | |
std::cout << "perform_work: thread started" << std::endl; | |
while(!bEnd){ | |
std::cout << "perform_work: waiting for data" << std::endl; | |
while(!bDataReady){ | |
pthread_mutex_lock(&mp); | |
pthread_cond_wait(&cv, &mp); | |
if(bEnd){ | |
std::cout << "perform_work: exiting" << std::endl; | |
break; | |
} | |
} | |
pthread_mutex_unlock(&mp); | |
if(bEnd){ | |
std::cout << "perform_work: exiting function" << std::endl; | |
return 0; | |
} | |
std::cout << "perform_work: processing data" << std::endl; | |
getchar(); | |
bProcessed = true; | |
bDataReady = false; | |
//signal main thread | |
pthread_cond_signal(&cv); | |
} | |
return NULL; | |
} | |
int main(int argc, char *argv[]) | |
{ | |
pthread_t threadProcess; | |
std::string data; | |
int result_code = pthread_cond_init(&cv, NULL); | |
if(result_code != 0){ | |
std::cout << "main: failed to create condition variable" << std::endl; | |
return 1; | |
} | |
result_code = pthread_create(&threadProcess, NULL, perform_work, NULL); | |
if(result_code != 0){ | |
std::cout << "main: failed to create thread" << std::endl; | |
return 1; | |
} | |
while(true){ | |
std::cout << "main: get processed data" << std::endl; | |
std::cout << "Enter data or quit: "; | |
std::cin >> data; | |
if(data == "q"){ | |
bEnd = true; | |
pthread_cond_signal(&cv); //signal thread and exit | |
break; | |
} | |
std::cout << "main: waking up processing thread" << std::endl; | |
bDataReady = true; | |
pthread_cond_signal(&cv); | |
std::cout << "main: waiting for data to be processed" << std::endl; | |
while(!bProcessed){ | |
pthread_mutex_lock(&mp); | |
pthread_cond_wait(&cv, &mp); | |
} | |
//reset all data | |
bDataReady = false; | |
bProcessed = false; | |
pthread_mutex_unlock(&mp); | |
} | |
//wait for everyone | |
result_code = pthread_join(threadProcess, NULL); | |
pthread_cond_destroy(&cv); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment