Left Up Right C++

Beispiel für einen Monitor mit condition variable

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

Informatik- und Netzwerkverein Ravensburg e.V Rudolf Weber