当我使用不同的编译器来编译下面的代码时,
auto future = std::async(std::launch::async, [&](){return myfunction();});
auto status = future.wait_for(std::chrono::milliseconds(5000));
if (status == std::future_status::ready)
{
auto result = future.get();
std::cout << "result is " << result << std::endl;
}
else
{
std::cout << (status == std::future_status::timeout ? "timeout" : "deferred") << std::endl;
}
当wait_for
函数等待myfunction
完成时(等待时间为5000毫秒),我将系统时钟提前一分钟。
- 在gcc版本10.2.0(GCC)中,
future::wait_for
很快返回超时 - 对于gcc版本13.2.0(GCC),
future::wait_for
仍在等待
似乎future::wait_for
在不同的编译器上有不同的行为。
根据wait_for,* 标准建议使用稳定的时钟来测量持续时间。如果实现使用系统时钟,等待时间也可能对时钟调整敏感。
看起来gcc版本10.2.0对future::wait_for
使用系统时钟,而gcc版本13.2.0对future::wait_for
使用稳定时钟。
这是否意味着编译器将使用一个稳定的时钟或系统时钟?
是否有任何编译标志来指定是否使用稳定时钟或系统时钟?
1条答案
按热度按时间zzzyeukh1#
这是否意味着编译器将使用一个稳定的时钟或系统时钟?
是的
是否有任何编译标志来指定是否使用稳定时钟或系统时钟?
不,我不知道有这样的旗帜。
std::future
有一些问题(主要与std::async
的返回类型有关)。如果我没记错的话,它甚至被认为是过时的。todo:添加引用)。这似乎是另一个。请注意,
std::future::wait_until
允许您选择要使用的时钟。这种差异可能只是因为Clock是time_point
s类型的一部分,而不是duration
(wait_for
的参数)。但是,您可以从您选择的时钟duration
计算time_point
,并将其与wait_until
一起使用以等待结果。