gcc std::future::wait_for是否使用不同的时钟(稳定时钟vs系统时钟)取决于编译器?

xzv2uavs  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(126)

当我使用不同的编译器来编译下面的代码时,

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使用稳定时钟。
这是否意味着编译器将使用一个稳定的时钟或系统时钟?
是否有任何编译标志来指定是否使用稳定时钟或系统时钟?

zzzyeukh

zzzyeukh1#

这是否意味着编译器将使用一个稳定的时钟或系统时钟?
是的
是否有任何编译标志来指定是否使用稳定时钟或系统时钟?
不,我不知道有这样的旗帜。
std::future有一些问题(主要与std::async的返回类型有关)。如果我没记错的话,它甚至被认为是过时的。todo:添加引用)。这似乎是另一个。
请注意,std::future::wait_until允许您选择要使用的时钟。这种差异可能只是因为Clock是time_point s类型的一部分,而不是durationwait_for的参数)。但是,您可以从您选择的时钟duration计算time_point,并将其与wait_until一起使用以等待结果。

相关问题