Created
February 20, 2023 20:39
-
-
Save stevedoyle/52fa235c4cc630ebe1dd822ef7f4f1ef to your computer and use it in GitHub Desktop.
Example of using a condition variable with a mutex using std C++
This file contains 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 <string> | |
#include <thread> | |
#include <mutex> | |
#include <condition_variable> | |
std::mutex m; | |
std::condition_variable cv; | |
std::string data; | |
bool ready = false; | |
bool processed = false; | |
void worker_thread() | |
{ | |
// Wait until main() sends data | |
std::unique_lock lk(m); | |
cv.wait(lk, []{return ready;}); | |
// after the wait, we own the lock. | |
std::cout << "Worker thread is processing data\n"; | |
data += " after processing"; | |
// Send data back to main() | |
processed = true; | |
std::cout << "Worker thread signals data processing completed\n"; | |
// Manual unlocking is done before notifying, to avoid waking up | |
// the waiting thread only to block again (see notify_one for details) | |
lk.unlock(); | |
cv.notify_one(); | |
} | |
int main() | |
{ | |
std::thread worker(worker_thread); | |
data = "Example data"; | |
// send data to the worker thread | |
{ | |
std::lock_guard lk(m); | |
ready = true; | |
std::cout << "main() signals data ready for processing\n"; | |
} | |
cv.notify_one(); | |
// wait for the worker | |
{ | |
std::unique_lock lk(m); | |
cv.wait(lk, []{return processed;}); | |
} | |
std::cout << "Back in main(), data = " << data << '\n'; | |
worker.join(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment