如何确定condition_variable :: wait_for是否超时

时间:2020-02-05 16:56:23

标签: multithreading c++11 timeout condition-variable

我有一个允许等待condition_variable的类,以照顾虚假的唤醒。以下是代码:

代码:

// CondVarWrapper.hpp
#pragma once
#include <mutex>
#include <chrono>
#include <condition_variable>

class CondVarWrapper {
public:
    void Signal() {
        std::unique_lock<std::mutex> unique_lock(mutex);
        cond_var_signalled = true;
        unique_lock.unlock();
        cond_var.notify_one();
    }

    // TODO: WaitFor needs to return false if timed out waiting
    bool WaitFor(const std::chrono::seconds timeout) {
        std::unique_lock<std::mutex> unique_lock(mutex);
        bool timed_out = false;
        // How to determine if wait_for timed out ?
        cond_var.wait_for(unique_lock, timeout, [this] {
            return cond_var_signalled;
        });
        cond_var_signalled = false;
        return timed_out;
    }

    void Wait() {
        std::unique_lock<std::mutex> unique_lock(mutex);
        cond_var.wait(unique_lock, [this] {
            return cond_var_signalled;
        });
        cond_var_signalled = false;
    }

private:
    bool cond_var_signalled = false;
    std::mutex  mutex;
    std::condition_variable cond_var;
};

// main.cpp
#include "CondVarWrapper.hpp"
#include <iostream>
#include <string>
#include <thread>

int main() {
   CondVarWrapper cond_var_wrapper;

   std::thread my_thread = std::thread([&cond_var_wrapper]{
       std::cout << "Thread started" << std::endl;
        if (cond_var_wrapper.WaitFor(std::chrono::seconds(1))) {
            std::cout << "Wait ended before timeout" << std::endl;
        } else {
            std::cout << "Timed out waiting" << std::endl;
        }
    });

   std::this_thread::sleep_for(std::chrono::seconds(6));
   // Uncomment following line to see the timeout working
   cond_var_wrapper.Signal();
   my_thread.join();
}

问题:
在方法WaitFor中,我需要确定cond_var是否超时等待?我怎么做? WaitFor在超时等待时应返回false,否则应返回true。有可能吗?
我在{em> cppreference 上看到了cv_status的解释,但是努力寻找如何使用它的好例子。

0 个答案:

没有答案