小编Tim*_*ynn的帖子

给定std :: chrono :: duration :: max后,std :: condition_variable :: wait_for立即退出

我有一个std::queue使用C ++ 11语义来允许并发访问的包装器。该std::queue保护带std::mutex。将项目推送到队列时,std::condition_variable会通过调用通知a notify_one

有两种从队列中弹出项目的方法。一种方法将无限期地阻塞,直到使用将该项目推送到队列中为止std::condition_variable::wait()。第二个将阻塞std::chrono::duration单位使用的时间std::condition_variable::wait_for()

template <typename T> template <typename Rep, typename Period>
void ConcurrentQueue<T>::Pop(T &item, std::chrono::duration<Rep, Period> waitTime)
{
    std::cv_status cvStatus = std::cv_status::no_timeout;
    std::unique_lock<std::mutex> lock(m_queueMutex);

    while (m_queue.empty() && (cvStatus == std::cv_status::no_timeout))
    {
        cvStatus = m_pushCondition.wait_for(lock, waitTime);
    }

    if (cvStatus == std::cv_status::no_timeout)
    {
        item = std::move(m_queue.front());
        m_queue.pop();
    }
}
Run Code Online (Sandbox Code Playgroud)

当我在空队列中像这样调用此方法时:

ConcurrentQueue<int> intQueue;

int value = 0;
std::chrono::seconds waitTime(12);

intQueue.Pop(value, waitTime);
Run Code Online (Sandbox Code Playgroud)

然后12秒后,对Pop()的调用将退出。但是,如果将waitTime设置为std::chrono::seconds::max(),则对Pop()的调用将立即退出。毫秒:: max()和小时数:: max()相同。但是,days …

condition-variable mingw-w64 c++11 c++-chrono

5
推荐指数
1
解决办法
1942
查看次数

标签 统计

c++-chrono ×1

c++11 ×1

condition-variable ×1

mingw-w64 ×1