LINUX.ORG.RU

timed_mutex это что?

Так-то у всех известных мне API кондваров есть методы типа timed_wait(), если ты об этом.

yoghurt ★★★★★
()

std::condition_variable_any ?

Class condition_variable provides a condition variable that can only wait on an object of type unique_lock<mutex>, allowing maximum efficiency on some platforms. Class condition_variable_any provides a general condition variable that can wait on objects of user-supplied lock types.

Pavval ★★★★★
()
Последнее исправление: Pavval (всего исправлений: 1)
Ответ на: комментарий от Pavval

Ну я так понимаю что он все равно не сумеет сделать захват мютекса с таймаутом. все равно нужно писать какуюто свою прослойку.

Cupper
() автор топика
template< class Rep, class Period >
std::cv_status wait_for( std::unique_lock<std::mutex>& lock,
                         const std::chrono::duration<Rep, Period>& rel_time);

не?

maverik ★★
()
Ответ на: комментарий от Cupper

Ну я так понимаю что он все равно не сумеет сделать захват мютекса с таймаутом.

В этом месте захотелось увидеть пример кода.

const86 ★★★★★
()
Ответ на: комментарий от const86
if (w_cond_.wait_until(lock, tp) == boost::cv_status::timeout)
    return false;

tp - timeout, но он не сработает если вдруг cv заблокируется на операции захвата мютекса, а мне хотелось бы что бы tp так же применялся и к захвату мютекса внутри cv.

Зачем? Защита от дурака, на случай если случился дедлок. Так хотя бы будет какая то реакция на действия юзера, вместо того что бы все встало колом.

        inline cv_status wait_until(
            unique_lock<mutex>& lk,
            chrono::time_point<chrono::system_clock, chrono::nanoseconds> tp)
        {
            using namespace chrono;
            nanoseconds d = tp.time_since_epoch();
            timespec ts = boost::detail::to_timespec(d);
            if (do_wait_until(lk, ts)) return cv_status::no_timeout;
            else return cv_status::timeout;
        }
    inline bool condition_variable::do_wait_until(
                unique_lock<mutex>& m,
                struct timespec const &timeout)
    {
...
thread_cv_detail::lock_on_exit<unique_lock<mutex> > guard;
...
guard.activate(m);
...
        template<typename MutexType>
        struct lock_on_exit
        {
            MutexType* m;

            lock_on_exit():
                m(0)
            {}

            void activate(MutexType& m_)
            {
                m_.unlock();
                m=&m_;
            }
            ~lock_on_exit()
            {
                if(m)
                {
                    m->lock(); // !!!!!! Здесь нужно lick_for()
                }
           }
        };
Cupper
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.