C++;11暂停执行一定时间的最准确方法? 我目前正在研究一些从视频文件中读取的C++代码,将视频/音频流解析成其组成单元(例如 FLV标签< /COD>),并将其退回,以便“重新流”它。

C++;11暂停执行一定时间的最准确方法? 我目前正在研究一些从视频文件中读取的C++代码,将视频/音频流解析成其组成单元(例如 FLV标签< /COD>),并将其退回,以便“重新流”它。,c++,c++11,sleep,C++,C++11,Sleep,因为我的输入来自文件,但我想在重新格式化此数据时模拟一个适当的帧速率,所以我正在考虑如何使正在对文件执行读取的线程休眠,以便尝试以给定的速率提取帧,这是人们在典型的30或60 FPS中可能期望的速率 一种解决方案是使用一个明显的std::this_thread::sleep_进行调用并传入毫秒数,具体取决于我的FPS。我正在考虑的另一个解决方案是使用一个条件变量,并使用具有相同想法的std::condition\u variable::wait\u for 我有点困了,因为我知道第一种解决方案不

因为我的输入来自文件,但我想在重新格式化此数据时模拟一个适当的帧速率,所以我正在考虑如何使正在对文件执行
读取
的线程休眠,以便尝试以给定的速率提取帧,这是人们在典型的30或60 FPS中可能期望的速率

一种解决方案是使用一个明显的
std::this_thread::sleep_进行
调用并传入毫秒数,具体取决于我的FPS。我正在考虑的另一个解决方案是使用一个条件变量,并使用具有相同想法的
std::condition\u variable::wait\u for

我有点困了,因为我知道第一种解决方案不能保证精确性——睡眠时间将和我传递的论点一样长,但理论上可能更长。我知道
std::condition_变量::wait_for
调用需要锁重新获取,这也需要一些时间。有比我考虑的更好的解决方案吗?否则,尝试暂停执行以获得尽可能精确的粒度的最佳方法是什么

C++11暂停执行一定时间的最准确方法

这:

auto start=now();
while(now()
now()
是系统可用的最精确时间测量方法的占位符

这类似于
睡眠
,就像自旋锁对互斥锁一样。与自旋锁一样,它会在暂停时消耗所有的CPU周期,但这正是您所要求的:暂停执行的最准确方式。在准确性和CPU使用效率之间有一个权衡:您必须选择哪个对您的程序更重要

对于
,为什么它比std::this_thread::sleep_更准确

因为
sleep\u for
产生线程的执行。因此,它的粒度永远不会比操作系统的进程调度器的粒度更好(假设还有其他进程在争夺时间)

上面显示的实时循环不会自动放弃其时间片,它将实现用于测量的时钟提供的最高粒度

当然,调度程序授予的时间片最终将用完,这可能发生在我们应该恢复的时间附近。减少这种影响的唯一方法是增加线程的优先级。在C++中没有标准的影响线程优先级的方法。完全消除这种影响的唯一方法是在非多任务系统上运行

在多CPU系统上,您可能想做的一个技巧是设置线程关联性,这样操作系统线程就不会迁移到其他硬件线程,从而导致延迟。同样,您可能希望设置其他线程的线程关联性,以避开时间测量线程。没有设置线程关联的标准工具


T是您希望睡眠的时间,G是
sleep\u for
可能超出的最大时间

如果T大于G,那么对于T-G时间单位使用
sleep\u将更有效,并且对于最终的G-O时间单位只使用活动循环(其中O是观察到的
sleep\u对于
超调的时间)

然而,计算出目标系统的G是什么是相当棘手的。这方面没有标准的工具。如果你估计过高,你会浪费更多的周期。如果你估计不足,你的睡眠可能会超出目标


如果您想知道什么是
now()
的好选择,标准库提供的最合适的工具是
std::chrono::stable\u clock
。但是,这不一定是系统上可用的最精确的工具。什么工具最准确取决于你瞄准的系统

C++11暂停执行一定时间的最准确方法

这:

auto start=now();
while(now()
now()
是系统可用的最精确时间测量方法的占位符

这类似于
睡眠
,就像自旋锁对互斥锁一样。与自旋锁一样,它会在暂停时消耗所有的CPU周期,但这正是您所要求的:暂停执行的最准确方式。在准确性和CPU使用效率之间有一个权衡:您必须选择哪个对您的程序更重要

对于
,为什么它比std::this_thread::sleep_更准确

因为
sleep\u for
产生线程的执行。因此,它的粒度永远不会比操作系统的进程调度器的粒度更好(假设还有其他进程在争夺时间)

上面显示的实时循环不会自动放弃其时间片,它将实现用于测量的时钟提供的最高粒度

当然,调度程序授予的时间片最终将用完,这可能发生在我们应该恢复的时间附近。减少这种影响的唯一方法是增加线程的优先级。在C++中没有标准的影响线程优先级的方法。完全消除这种影响的唯一方法是在非多任务系统上运行

在多CPU系统上,您可能想做的一个技巧是设置线程关联性,这样操作系统线程就不会迁移到其他硬件线程,从而导致延迟。同样,您可能希望设置其他线程的线程关联性,以避开时间度量
auto start = now();
while(now() < start + wait_for);