2013-09-24 51 views
1

我在等待我的载体是足够大的单元测试一些代码:condition_variable :: wait_for总是等待?

bool waitForOutwardMessages(size_t size, int millis) { 
    std::unique_lock<std::mutex> lock(mutex); 
    return ready.wait_for(lock, std::chrono::milliseconds(millis), [=]{ 
     return this->messages.size() >= size; 
    }); 
} 

std::mutex mutex; 
std::condition_variable ready; 

很容易的。除了当我运行这个测试时,我期望在我在另一个线程上进行这个调用之后,有问题的向量应该填满毫秒级。也许10ms,也许100ms,肯定在1s内。但是当我通过5000作为millis的参数时,这个函数总是等待5秒钟。

一方面,这很好,因为我不在乎这个测试需要多长时间。另一方面,我认为只有在条件变量未被通知的情况下,它才应该等待持续时间......并非总是如此?

有没有办法让它早点返回?

+2

你准备好了吗?发送信号完全可能是因为wait_for调用被执行。 –

+0

@JesusRamos是的,实际上是这样的:(我没有通知的一个案例是我在这里实际测试的一个案例谢谢!!我应该删除这个问题吗 – Barry

+0

问题仍然有效,我可以 –

回答

1

检查您是否正在拨打ready上的信号或广播。如果您不小心在实际等待之前发出信号,可能会发生比赛(这会导致等待超时)。

+0

这实际上发生了什么?新的C++库代码在开始等待之前没有检查谓词*这是一种...愚蠢的 –

+0

我刚刚检查并且条件等待本应该是在释放锁之前检查Predicate并开始等待,所以没有可能的竞争条件,如果代码正确地锁定了每个访问改变谓词的地方 –

+0

@ZanLynx关键在于if,有时候人们会忘记锁信号/广播 –

相关问题