Skip to content

Instantly share code, notes, and snippets.

@domiyanyue
Created December 19, 2020 01:59
Show Gist options
  • Save domiyanyue/7a4d438d0e93c487d8b976fb162b2453 to your computer and use it in GitHub Desktop.
Save domiyanyue/7a4d438d0e93c487d8b976fb162b2453 to your computer and use it in GitHub Desktop.
conditiona_variable_producer_consumer
#include <condition_variable> // std::condition_variale
#include <cstdlib>
#include <iostream>
#include <mutex>
#include <thread>
using namespace std;
std::mutex g_mutex;
std::condition_variable g_cv;
bool g_ready = false;
int g_data = 0;
int produceData() {
int randomNumber = rand() % 1000;
std::cout << "produce data: " << randomNumber << "\n";
return randomNumber;
}
void consumeData(int data) { std::cout << "receive data: " << data << "\n"; }
void consumer() {
int data = 0;
while (true) {
std::unique_lock<std::mutex> ul(g_mutex);
g_cv.wait(ul, []() { return g_ready; });
consumeData(g_data);
g_ready = false;
ul.unlock();
g_cv.notify_one();
}
}
void producer() {
while (true) {
std::unique_lock<std::mutex> ul(g_mutex);
g_data = produceData();
g_ready = true;
ul.unlock();
g_cv.notify_one();
ul.lock();
g_cv.wait(ul, []() { return g_ready == false; });
}
}
void consumerThread(int n) { consumer(); }
void producerThread(int n) { producer(); }
int main() {
int times = 100;
std::thread t1(consumerThread, times);
std::thread t2(producerThread, times);
t1.join();
t2.join();
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment