struct message { /* любые поля и методы */ };const message msg{ /*intialization*/ };send_message(msg); // <--- все кто подписан на message (или на имена мемберов посылки)// получат это сообщение
std::thread(processKeyboard).detach();std::thread(processPrinter).detach();
tools::thread_pool pool;const auto proccessKey = [](const auto& key) { /*...*/ };const auto inputKey = [&pool](){ const auto key = keyboard(); if(check_need_exit(key)) pool.stop(); else pool.add_task(proccessKey, key);};pool.add_task(inputKey);pool.start();pool.wait_stop_all();
#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();}
for(auto key = waitKey(); !needExit(key); key = waitKey()) print(key);