#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<std::mutex> 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<std::mutex> lk(m); ready = true; std::cout << "main() signals data ready for processing\n"; } cv.notify_one(); // wait for the worker { std::unique_lock<std::mutex> lk(m); cv.wait(lk, []{return processed;}); } std::cout << "Back in main(), data = " << data << '\n'; worker.join();}
C++ (Qt)#include <QtWidgets> QString data; QSemaphore semWork(0), semMain(1); class MyThread : public QThread { void run( void ) { while (true) { semWork.acquire(); if (!data.size()) break; data += " proccesed"; qDebug() << data; semMain.release(); } }}; int main(){ MyThread worker; worker.start(); const int numTest = 5; for (int i = 0; i < numTest + 1; ++i) { semMain.acquire(); if (i == numTest) data.clear(); else data = "data " + QString::number(i + 1); semWork.release(); } worker.wait();}