- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个函数,它以 long
的形式接收超时发生前的微秒数。此超时是函数完成其工作的超时,即使由于调度和其他开销等原因,函数可能需要比超时更长的时间。
该函数执行以下操作:
std::future
和 std::async
执行一些设置并启动多个线程。std::future::wait_for()
跟踪线程。基本上,我对每次调用 wait_for()
进行计时,然后从超时中减去它所花费的时间。然后在检查下一个线程时使用这个新超时。我的目标是确保我启动的所有线程在超时(即传递给函数的超时参数)到期之前完成它们的工作。伪代码如下:
void myFunctionWithTimeout(/*some other inputs*/ const long timeout_us) {
auto start_time = std::chrono::steady_clock::now();
double time_remaining_us = std::chrono::microseconds(timeout_us).count();
// Launch threads here using std::future and std::async...
auto end_time = std::chrono::steady_clock::now();
const auto setup_time_us =
std::chrono::duration<double, std::micro>(end_time - start_time);
time_remaining_us -= setup_time_us.count();
for(auto& worker : workers) {
auto start_time = std::chrono::steady_clock::now();
const auto status =
worker.wait_for(std::chrono::duration<double, std::micro>(time_remaining_us));
auto end_time = std::chrono::steady_clock::now();
// Check status and do the appropriate actions.
// Note that it is OK that this time isn't part of the timeout.
const auto wait_time_us =
std::chrono::duration<double, std::micro>(end_time - start_time);
time_remaining_us -= wait_time_us.count();
}
}
我的问题:
double
,以便在各种计算中我可以计算微秒的分数。请注意,我知道 wait_for()
不会完全等待我指定的持续时间,因为调度和其他原因,但至少,我不想添加任何舍入我的计算有误。std::chrono::duration
?我希望将剩余时间存储为持续时间,然后从中减去设置时间或等待时间。time_remaining_us
变为负数时会发生什么?这对 std::chrono::duration
的构造函数有何影响?将负持续时间传递给 std::future::wait_for()
时会发生什么?我没有在文档中找到这些详细信息,并且想知道此处的行为是否定义明确。============================================= ======================编辑添加:
根据 Howard 的回答,我研究了使用 wait_until()
,但由于我在研究中发现的以下问题(摘自:https://en.cppreference.com/w/cpp/thread/future/wait_until),我认为它对我不起作用):
The clock tied to timeout_time is used, which is not required to be a monotonic clock.There are no guarantees regarding the behavior of this function if the clock is adjusted discontinuously, but the existing implementations convert timeout_time from Clock to std::chrono::system_clock and delegate to POSIX pthread_cond_timedwait so that the wait honors ajustments to the system clock, but not to the the user-provided Clock. In any case, the function also may wait for longer than until after timeout_time has been reached due to scheduling or resource contention delays.
我的理解是,即使我使用 steady_clock
作为我的结束时间,它也会被转换为 system_clock
,这意味着如果时钟被调整(比如说回滚一个小时)我最终可能会超时,比我预期的要长得多。
也就是说,我确实采用了计算结束时间的概念,它简化了我的代码。这是我目前所处位置的一些伪代码:
void myFunctionWithTimeout(/*some other inputs*/ const long timeout_us) {
const auto start_time = std::chrono::steady_clock::now();
const auto end_time =
start_time + std::chrono::duration<double, std::micro>(timeout_us);
// Launch threads here using std::future and std::async...
for(auto& worker : workers) {
const auto current_timeout_us =
std::chrono::duration<double, std::micro>(end_time - std::chrono::steady_clock::now());
if (current_timeout_us.count() <= 0) { // Is this needed?
// Handle timeout...
}
const auto status = worker.wait_for(current_timeout_us);
// Check status and do the appropriate actions...
}
}
我仍然不确定是否可以将负持续时间传递给 wait_for()
,所以我先手动检查。如果有人知道 wait_for()
是否可以接受负持续时间,请告诉我。另外,如果我对 wait_until()
的文档的理解不正确,也请告诉我。
最佳答案
只需使用 wait_until
而不是 wait_for
。计算您要等到一次的 time_point
,并继续使用它。如果 time_point
开始落入过去,wait_until
将立即返回。
关于c++ - 使用 std::chrono::duration 跟踪超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52249068/
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
C++20 计时类型/值之间有什么区别 month{7}和 months{7} ?有两个如此相似的名字是不是很困惑? 最佳答案 是的,同时拥有 month 可能会令人困惑。和 months第一次遇到这
在我的项目中,在我升级到 VS2015 之前,它编译得很好。现在我收到 10 个与 std::chrono::timepoint 有关的错误。这些都是错误:https://gyazo.com/0d3c
在 Linux 上运行(uname 说:) Linux 2.6.32-431.29.2.el6.x86_64 #1 SMP Sun Jul 27 15:55:46 EDT 2014 x86_64 x8
下面的代码不打印epoch。 typedef std::chrono::high_resolution_clock Clock; typedef std::chrono::milliseconds M
我有这个测试代码: #include #include #include namespace chrono = std::chrono; int main() { struct time
我正在使用 jmeter 和 maven 进行性能测试 (REST)。 在我的 pom 中,我有以下插件: chronos-jmeter-maven-plugin:执行我的 jmx 项目 chrono
我有一个 chrono::format::strftime 的静态数组我的应用程序支持的格式。我想避免在运行时解析它们,所以我定义了一个 lazy_static!将它们解析为 chrono::form
我正在尝试编写一个允许用户指定 chrono::duration 的函数,例如 chrono::seconds 并返回 chrono 的结果::duration::count. 我可以使用以下模板函数
考虑以下代码片段: #include #include int main() { auto result1 = std::chrono::duration_cast(std::chron
考虑下面这段代码 #include #include #include int main() { using std::chrono::system_clock; using std
boost::chrono::steady_clock::time_point 之间有什么区别?和 boost::chrono::time_point ,为什么不能相互转换? 这似乎非常多余。 最佳答
我正在尝试在 mingw64 (GCC v11.2) 中构建我的程序。我有以下结构: 在头文件中: struct Timer { std::chrono::time_point start;
有没有什么优雅的方法可以将 boost chrono time_point 转换为标准库中的等价物? 最佳答案 恐怕你不能保证转换,除非你先验地接受 boost::chrono::steady_clo
以下程序: #include #include #include inline uint64_t now() { return std::chrono::duration_cast
我有一个变量存储为 long 来自 std::chrono::system_clock::time_point.time_since_epoch().count() 的值。我现在想从 long 变量中
extern crate chrono; use chrono::{DateTime, Utc}; use std::time::Duration; pub fn after(start: DateT
我想在几秒钟内使用 chrono 库找出 2 个时钟之间的差异。我尝试了多种方法,以下是其中之一。所有这些都工作正常,直到差异为 59 秒,但之后超时。我真的需要差异的实际值,即使它超过 59 秒 #
我试图计算执行插入排序函数期间耗时。所以我做了如下。附言- 函数运行正常并对所有数字进行排序。编译器-GCC window auto start = chrono::steady_clock:
我有一个年 (int)、月 (int) 和日 (int) 形式的日期,例如,2018、10、12 表示 2018 年 10 月 12 日。 有没有一种方法可以使用带有这些整数的 C++ Chrono
我是一名优秀的程序员,十分优秀!