- 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/
我正在尝试使用普通的 Windows Metro 风格应用程序执行以下操作: public class MyButton : Button { public Duration Duration
有下表 "CREATE TABLE IF NOT EXISTS user_preferences (" + " user_id text,"
假设我有: t := 10 * time.Second // 10s, 当 time.Second 再次应用时,幕后发生了什么? tt := t * time.Second // -2346317h4
在 Java 8 中, Duration 类(class)提供了 toDays 方法,返回总天数作为与日历天无关的 24 小时时间块的计数。 在 Java 9 中,Duration上课得心应手 to…
这很奇怪,经过数小时的测试我仍然无法弄清楚。 好的,这就是我要做的:合并两个视频,也就是一个接一个地追加。 我拍摄了两个视频,然后有两个网址。然后我使用以下方法创建了两个 AVURLAsset: A
正如标题所说,我得到一个字符串'01:23.290',它看起来像一个Duration,但不是。现在我需要用它来与真实的 Duration 进行比较,而我不知道如何处理它。有什么方法吗? 最佳答案 使用
std::chrono::duration的默认构造函数定义如下: constexpr duration() = default; (例如,参见 cppreference.com 或 libstdc+
我正在尝试在我的应用程序中录制视频,我注意到在显示它们的duration 时,我看到了错误的分钟\秒。只有通过以下代码录制的视频才会发生这种情况。通过其他应用录制的视频,时长显示在右侧: publi
我对 AVPlayer.timeControlStatus 属性进行 KVO 处理,播放器有一个 AVPlayerItem。 该视频是托管在远程服务器上的 mpeg4 编码的 10 秒视频文件: le
我正在使用 Spring Reactor Core 3.0.6 并且我有一个返回 Flux 的方法: public Flux createFlux(){ return Flux.,String
当然,我在这里做了一些愚蠢的事情,但我在编译我的简单秒表类时遇到了问题。错误是: /usr/include/c++/4.9/chrono:246:2: error: static assertion
此代码在 gcc-4.8 上编译但在 clang-3.3 上失败?以及如何使这段代码可以在 clang 上编译? =\ #include #include #include void sleep
我正在尝试编写一个允许用户指定 chrono::duration 的函数,例如 chrono::seconds 并返回 chrono 的结果::duration::count. 我可以使用以下模板函数
我不明白在 Go 中划分一个 time.Duration 是什么意思。 例如,这是 super 可爱的: d,_ := time.ParseDuration("4s") fmt.Println(d/4
我是一个初学者程序员,在 scala 中有一个非常简单的问题,我想将一个 long var 转换为 Duration (import scala.concurrent.duration.Duratio
我想知道这两者之间的区别是什么 boost::timed_mutex _mutex; if(_mutex.timed_lock(boost::get_system_time() + boost::po
我正在尝试实现 JUnit 测试来测试参与者。 我有这个 ActorTest : import org.junit.Test; import play.libs.Akka; import playte
假设您有一个涉及两个 Web 应用程序的项目(将共享 DAL/DAO/BO 程序集和一些 OSS 库): 一个半复杂的管理应用程序,使用 Windows Live ID 进行身份验证,并且还能够与各种
根据 moment.js documentation您可以创建 moment 的本地实例,以使用全局设置以外的其他语言环境来格式化日期。 使用 format() 效果很好,但我如何在本地实例上使用 d
我的项目提示“调用中有一个额外的参数‘duration’”。这是它发生的地方 required init(coder aDecoder: NSCoder) { workout = Workou
我是一名优秀的程序员,十分优秀!