Boost logo

Boost :

Subject: Re: [boost] [thread] countdown_latch
From: Michael Marcin (mike.marcin_at_[hidden])
Date: 2013-04-27 03:51:26


On 4/27/2013 2:05 AM, Vicente J. Botet Escriba wrote:
>
> The change set is https://svn.boost.org/trac/boost/changeset/84055. To
> see the sources, you would need to update the trunk or to take a look at
> https://svn.boost.org/svn/boost/trunk/boost/thread/
>
> Please let me know what do you think.
>

I think in latch your wait_for and wait_until don't work correctly in
the case of spurious wakes.

The easy answer to this is probably use the predicate versions, which
will also handle the technicalities of turning wait_for into wait_until
during loops caused by spurious wakes.

like:

struct count_not_zero
{
     count_not_zero(const std::size_t& count_) : count(count_) {}
     bool operator()() const { return count != 0; }
     const std::size_t& count;
};

template <class Rep, class Period>
cv_status wait_for(const chrono::duration<Rep, Period>& rel_time)
{
     boost::unique_lock<boost::mutex> lk(mutex_);
     return cond_.wait_for(rel_time, count_not_zero(count_));
}

template <class lock_type, class Clock, class Duration>
cv_status wait_until(const chrono::time_point<Clock, Duration>& abs_time)
{
     boost::unique_lock<boost::mutex> lk(mutex_);
     return cond_.wait_until(abs_time, count_not_zero(count_));
}

You should probably also add a latch_any to go along with
condition_variable_any.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk