Skip to content

Instantly share code, notes, and snippets.

@alexandruc
Created August 31, 2016 11:37
Show Gist options
  • Save alexandruc/ff3fbb52fdd46e482ac5d6b3433a544c to your computer and use it in GitHub Desktop.
Save alexandruc/ff3fbb52fdd46e482ac5d6b3433a544c to your computer and use it in GitHub Desktop.
pthread producer-consumer
#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