Skip to content

Instantly share code, notes, and snippets.

@igricart
Last active November 11, 2020 11:35
Show Gist options
  • Save igricart/810ddefde29f52334318f0be0090658a to your computer and use it in GitHub Desktop.
Save igricart/810ddefde29f52334318f0be0090658a to your computer and use it in GitHub Desktop.
example of condition_variable usage

Example to show the usage of condition variable

In addition to the good documentation provided by cppreference

I had a doubt that the mutex would be locked in the waiting cycle, but because of the condition_variable::wait() function, it actually allows other threads to access the variable while no notifi_all() method has been called.

#include <iostream>
#include <condition_variable>
#include <thread>
#include <chrono>

std::condition_variable cv;
std::mutex cv_m; // This mutex is used for three purposes:
				 // 1) to synchronize accesses to i
				 // 2) to synchronize accesses to std::cerr
				 // 3) for the condition variable cv
int i = 0;

void waits()
{
	std::unique_lock<std::mutex> lk(cv_m);
	std::cerr << "Waiting... \n";
	// wait() is going to allow other to use the mutex while the notification has not been received
	cv.wait(lk, [] { return i == 1; });
	std::cerr << "...finished waiting. i == 1\n";
}

void signals()
{
	std::this_thread::sleep_for(std::chrono::seconds(1));
	{
		std::lock_guard<std::mutex> lk(cv_m);
		std::cerr << "Notifying...\n";
	}
	cv.notify_all();

	std::this_thread::sleep_for(std::chrono::seconds(1));

	{
		std::lock_guard<std::mutex> lk(cv_m);
		i = 1;
		std::cerr << "Notifying again...\n";
	}
	cv.notify_all();
}

int main()
{
	std::thread t1(waits), t2(waits), t3(waits), t4(signals);
	t1.join();
	t2.join();
	t3.join();
	t4.join();
}

Run the application using the following commands g++ main.cpp -lpthread && ./a.out

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment