具有定时功能的多线程队列

时间:2017-10-25 06:07:31

标签: multithreading c++11 thread-safety mutex condition-variable

我在C ++中使用定时功能实现多线程队列,即poppush可以将超时作为额外参数。

基本代码如下所示。

template <typename T>
class Queue
{
public:
    Queue() = default;
    // Usage of a mutex makes the Queue class neither copyable nor movable
    Queue(const Queue&) = delete;
    Queue& operator=(const Queue&) = delete;

    T Pop(const std::chrono::microseconds& micro_secs=std::chrono::microseconds::max())
    {
        std::unique_lock<std::mutex> lock(mutex_);

        if (!cond_var_.wait_for(lock, micro_secs, [this]() { return !queue_.empty(); }))
        {
            // TODO: throw
        }

        auto item = queue_.front();
        queue_.pop();
        return item;
    }

    void Push(T& item, const std::chrono::microseconds& micro_secs=std::chrono::microseconds::max())
    {
        std::unique_lock<std::mutex> lock(mutex_, std::defer_lock);
        if (!lock.try_lock_for(micro_secs)) // for this std::mutex should be std::timed_mutex.
        {
            // Couldn't acquire lock during the specified time.
            // TODO: throw
        }
        queue_.push(item);
        lock.unlock();
        cond_var_.notify_one();
    }

private:
    std::queue<T> queue_;
    std::mutex mutex_;
    std::condition_variable cond_var_;
};

对于Pop()函数,为了使条件变量超时,互斥锁应 std::mutex

但是对于Push()函数获取锁定时超时,互斥锁应该是std::timed_mutex。如果try_lock_for中包含的互斥锁满足unique_lock要求,则TimedLock有效。

我很高兴听到解决此问题的任何解决方法。

Pop()要求队列中的互斥std::mutex,因为condition_variable::wait_for()适用于std::mutex。另一方面,Push()要求队列中的互斥std::timed_mutex。如何通过队列上的单个锁来解决问题,即Queue类中的单个互斥锁。

提前致谢。

0 个答案:

没有答案
相关问题