C++
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