20 Aralık 2017 Çarşamba

thread condition_variable Sınıfı

Giriş
Bu sınıf üzerinde kaç tane thread'in beklediğini belirten bir metod sunmuyor. Java'da bu tür metodlar var.
Constructor
Şöyle yaparız.
boost::condition_variable c;
notify_one metodu
Şöyle yaparız.
c.notify_one();
wait metodu
Açıklaması şöyle. UTC saat kullanılmalı.
Use boost::get_system_time() + dt, which is UTC-based, instead of local_time() + dt, which is timezone-adjusted, because wait_lock(...) uses boost::get_system_time() to compare current time with the target absolute time.
Şöyle yaparız.
boost::posix_time::time_duration dt = ...;
boost::mutex::scoped_lock lock (mutex);
boost::system_time x = boost::get_system_time () + dt;
bool timedOut = false;
while((done == false) && (x > boost::posix_time::get_system_time())) {
  timedOut = ! cond.timed_wait(lock,x);
}
wait_until metodu
İmzası şöyle.

bool wait_until(unique_lock<mutex>& lock,const chrono::time_point<Clock, Duration>& t,
  Predicate pred);
Metodun için şöyle.

template <class Clock, class Duration, class Predicate>
bool wait_until(unique_lock<mutex>& lock,const chrono::time_point<Clock, Duration>& t,
  Predicate pred)
{
  while (!pred())
  {
    if (wait_until(lock, t) == cv_status::timeout)
      return pred();
    }
    return true;
}
Örnek
Şöyle yaparız.
#include <boost/thread.hpp>
#include <iostream>

int main()
{
  boost::mutex m;
  boost::condition_variable cv;

  boost::unique_lock<boost::mutex> lk(m);
  if (cv.wait_until(lk,
        boost::chrono::high_resolution_clock::now() + boost::chrono::seconds(1), 
        [] { return false; }))
  {
    std::cout << "Yay\n";
  } else {
    std::cout << "Nay\n";
  }
}

Hiç yorum yok:

Yorum Gönder