使用谓词的 boost::condition_variable::wait_until 的 bool 版本如何表现?
How does bool version of boost::condition_variable::wait_until using a predicate behave?
正在尝试使用:
bool
wait_until(
unique_lock<mutex>& lock,
const chrono::time_point<Clock, Duration>& t,
Predicate pred);
boost::condition_variable::wait_until
的形式(长话短说为什么不是 std
)。文档指出这样做的效果是 "As-if:"
while(!pred())
{
if(!wait_until(lock,abs_time))
{
return pred();
}
}
return true;
但是 wait_until
的 wait_until(lock,abs_time)
形式实际上 return 是一个 cv_status
类型定义为:
enum class cv_status;
{
no_timeout,
timeout
};
由于 cv_status
类型不能隐式转换为 bool
(对吗?),"As-if" 的条件 if(!wait_until(lock,abs_time))
究竟意味着什么?我想象它在说 "if the wait times out, return the value of the predicate" 但我没有从 if
语句的形式和 wait_until
return 类型的 wait_until
.
现在,std
文档 "Equivalent to" 似乎正是我所期望的:
while (!pred()) {
if (wait_until(lock, abs_time) == std::cv_status::timeout) {
return pred();
}
}
return true;
因此,可以安全地假设 boost
文档有一点偏差并且实现如 std
文档中所述吗?
您可能混淆了文档¹。
在此示例代码中:Live On Coliru(输出:"Nay")
#include <boost/thread.hpp>
#include <iostream>
int main()
{
boost::mutex m;
boost::condition_variable cv;
boost::unique_lock<boost::mutex> lk(m);
if (cv.wait_until(lk,
boost::chrono::high_resolution_clock::now() + boost::chrono::seconds(1),
[] { return false; }))
{
std::cout << "Yay\n";
} else {
std::cout << "Nay\n";
}
}
wait_until
的return类型其实是bool。该调用的实现实际上是:
template <class Clock, class Duration, class Predicate>
bool
wait_until(
unique_lock<mutex>& lock,
const chrono::time_point<Clock, Duration>& t,
Predicate pred)
{
while (!pred())
{
if (wait_until(lock, t) == cv_status::timeout)
return pred();
}
return true;
}
如您所见,它明确处理了 cv_status
类型。
Other than that it does look as if [sic] the "As-if" code is pseudo-code that assumes a bool-kind of return value. I agree this is technically "incorrect".
¹ 请参见
正在尝试使用:
bool
wait_until(
unique_lock<mutex>& lock,
const chrono::time_point<Clock, Duration>& t,
Predicate pred);
boost::condition_variable::wait_until
的形式(长话短说为什么不是 std
)。文档指出这样做的效果是 "As-if:"
while(!pred())
{
if(!wait_until(lock,abs_time))
{
return pred();
}
}
return true;
但是 wait_until
的 wait_until(lock,abs_time)
形式实际上 return 是一个 cv_status
类型定义为:
enum class cv_status;
{
no_timeout,
timeout
};
由于 cv_status
类型不能隐式转换为 bool
(对吗?),"As-if" 的条件 if(!wait_until(lock,abs_time))
究竟意味着什么?我想象它在说 "if the wait times out, return the value of the predicate" 但我没有从 if
语句的形式和 wait_until
return 类型的 wait_until
.
现在,std
文档 "Equivalent to" 似乎正是我所期望的:
while (!pred()) {
if (wait_until(lock, abs_time) == std::cv_status::timeout) {
return pred();
}
}
return true;
因此,可以安全地假设 boost
文档有一点偏差并且实现如 std
文档中所述吗?
您可能混淆了文档¹。
在此示例代码中:Live On Coliru(输出:"Nay")
#include <boost/thread.hpp>
#include <iostream>
int main()
{
boost::mutex m;
boost::condition_variable cv;
boost::unique_lock<boost::mutex> lk(m);
if (cv.wait_until(lk,
boost::chrono::high_resolution_clock::now() + boost::chrono::seconds(1),
[] { return false; }))
{
std::cout << "Yay\n";
} else {
std::cout << "Nay\n";
}
}
wait_until
的return类型其实是bool。该调用的实现实际上是:
template <class Clock, class Duration, class Predicate>
bool
wait_until(
unique_lock<mutex>& lock,
const chrono::time_point<Clock, Duration>& t,
Predicate pred)
{
while (!pred())
{
if (wait_until(lock, t) == cv_status::timeout)
return pred();
}
return true;
}
如您所见,它明确处理了 cv_status
类型。
Other than that it does look as if [sic] the "As-if" code is pseudo-code that assumes a bool-kind of return value. I agree this is technically "incorrect".
¹ 请参见