Ein Monitor ist ein Objekt, in dem sich mehrere Threads treffen. Nur ein Thread darf die internen Attribute modifizieren
/* Beispiel für Conditionvariable * siehe https://en.cppreference.com/w/cpp/thread/condition_variable */ #include <iostream> #include <thread> #include <mutex> #include <chrono> #include <condition_variable> #include <stdint.h> class Monitor { public: Monitor(uint64_t iv):counter_(iv) {} void decr(); void wait_for_zero(); private: std::mutex m_; std::condition_variable cv_; uint64_t counter_; }; void Monitor::decr() { std::unique_lock guard(m_); counter_--; if(counter_ == 0) { guard.unlock(); cv_.notify_one(); } } void Monitor::wait_for_zero() { std::unique_lock guard(m_); cv_.wait(guard, [this]{return (this->counter_ == 0);}); } Monitor monitor(10); void worker() { int i=0; while(i<11) { std::this_thread::sleep_for(std::chrono::milliseconds(1000)); i++; monitor.decr(); std::clog << i << std::endl; } } int main() { std::thread workerthread(worker); monitor.wait_for_zero(); std::cout << "Counter im Monitor ist 0 !" << std::endl; workerthread.join(); }
Übersetzt wird dieses Programm mit
g++ -o cv cv.cpp