boost Deadline_timer 最小示例:我应该替换“睡眠”吗?

2024-04-29

我有一个线程,我需要每 10 毫秒执行一些操作。所以我有非常简单的代码,如下所示:

while (work) {
    // do something
    Sleep(10000); // boost sleep can be also used
}

我听说Sleep一般不推荐,如果我用它代替deadline_timer整体应用程序性能会更好,特别是我会避免昂贵的“上下文切换”。

我应该改变吗sleep to deadline_timer如果是这样,有人可以举个例子吗?


这完全取决于 10ms 的要求。


迭代之间有 10ms 的延迟

如果应用程序需要在迭代之间有 10 毫秒的延迟,那么睡眠就可以了。假设work()需要 7 毫秒才能完成,时间线将导致以下结果:


 Time  | Action
-------+------------
0.000s | begin work
0.007s | finish work, block
0.017s | finish blocking, begin work
0.024s | finish work, block
0.034s | finish blocking, begin work  

可能值得考虑使用 Boost.Threadthis_thread::sleep_for() http://www.boost.org/doc/libs/1_53_0/doc/html/thread/thread_management.html#thread.thread_management.this_thread.sleep_for为了可读性:

#include <boost/thread.hpp>

int main()
{
  for (;;)
  {
    work();
    boost::this_thread::sleep_for(boost::chrono::milliseconds(10));
  }
}

迭代之间最大延迟 10 毫秒

如果迭代之间的最大延迟为 10 毫秒,则执行工作所花费的时间需要从 10 毫秒延迟中减少。假设work()需要 7 毫秒才能完成,时间线将导致以下结果:


 Time  | Action
-------+------------
0.000s | begin work
0.007s | finish work, block
0.010s | finish blocking, begin work
0.017s | finish work, block
0.020s | finish blocking, begin work  

The 同步使用计时器 http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/tutorial/tuttimer1.html教程可能是一个很好的起点。需要考虑的一点是 Boost.Asio 提供了一些计时器。如果 10ms 延迟不应受到系统时钟更改的影响,则考虑使用steady_timer http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/reference/steady_timer.html。否则,deadline_timer http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/reference/deadline_timer.html应该没事。

#include <boost/asio/steady_timer.hpp>

boost::asio::io_service io_service;
boost::asio::steady_timer timer(io_service);

int main()
{
  for (;;)
  {
    timer.expires_from_now(boost::chrono::milliseconds(10));
    work();
    timer.wait();
  }
}

另一个考虑因素是,如果work()需要 13 毫秒才能完成,则工作之间不会有延迟,因为已超过最大延迟。然而,这导致work()每 13 毫秒完成一次,而不是work()每 10 毫秒执行一次。


 Time  | Action
-------+------------
0.000s | begin work
0.013s | finish work, block
0.013s | finish blocking, begin work
0.026s | finish work, block
0.039s | finish blocking, begin work  

每 10 毫秒执行一次工作

如果完成所需的时间work()超过延迟,则work()不会每 10ms 执行一次。为了实现这一点,可能需要使用多个线程。以下是一个时间线,其中有 2 个线程异步执行每 10 毫秒计划一次的工作,但需要 13 毫秒才能完成:


 Time  | Thread A                   | Thread B
-------+----------------------------+---------------------------
0.000s | schedule work, begin work  |
0.010s |                            | schedule work, begin work 
0.013s | finish work, block         |
0.020s | schedule work, begin work  |
0.023s |                            | finish work, block
0.030s |                            | schedule work, begin work
0.033s | finish work, block         |  

The 异步使用计时器 http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/tutorial/tuttimer2.html可以提供基本介绍。总体想法是将工作添加到io_service,并且每 10 毫秒就有一个正在运行的线程io_service将被选择调用work()。线程池大小可以根据时间量增加或减少work()需要完成。如果工作需要 7 毫秒,则单个线程可以异步等待计时器。

#include <boost/asio/steady_timer.hpp>

boost::asio::io_service io_service;
boost::asio::steady_timer timer(io_service);

void handle_timer(const boost::system::error_code& error);

void schedule_work()
{
  // Schedule more work.
  timer.expires_from_now(boost::chrono::milliseconds(10));
  timer.async_wait(&handle_timer);
}

void handle_timer(const boost::system::error_code& error)
{
  if (error) return;
  schedule_work();
  work();
}

int main()
{
  // Add work to io_service.
  schedule_work();

  // Create 2 threads that will run io_service.
  boost::thread_group threads;
  for (std::size_t i = 0; i < 2; ++i)
    threads.create_thread(boost::bind(
      &boost::asio::io_service::run, &io_service));

  // Wait for threads to finish.
  threads.join_all();
}

在引入并发以满足截止日期时,请验证work()是线程安全的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

boost Deadline_timer 最小示例:我应该替换“睡眠”吗? 的相关文章

  • 通过 SocketCAN 进行 boost::asio

    我正在考虑利用升压阿西奥 http www boost org doc libs 1 49 0 doc html boost asio html从a读取数据套接字CAN http en wikipedia org wiki SocketCA
  • 在 C/C++ 中获得正模数的最快方法

    通常在我的内部循环中 我需要以 环绕 方式索引数组 因此 例如 如果数组大小为 100 并且我的代码要求元素 2 则应该给它元素 98 高级语言 例如 Python 可以简单地使用my array index array size 但由于某
  • 我如何理解这个 C 类型声明?

    double bar int double double double double 在查看讲座幻灯片时 我发现了留给学生的练习 用简单的英语来说 什么是类型bar在这个 C 声明中 Please帮助我解决这个问题 我什至不知道从哪里开始
  • 何时使用 =default 使析构函数默认?

    尽管对构造函数使用 default 对我来说很清楚 即强制编译器在其他构造函数存在时创建默认构造函数 但我仍然无法理解这两种类型的析构函数之间的区别 那些使用 default 的 那些没有显式定义并由编译器自动生成的 我唯一想到的是 gro
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • 如何在 C# / .NET 中创建内存泄漏[重复]

    这个问题在这里已经有答案了 可能的重复 托管代码中是否可能存在内存泄漏 特别是 C 3 0 https stackoverflow com questions 6436620 is it possible to have a memory
  • 类特定的新删除运算符是否必须声明为静态

    标准中是否要求类特定的 new new delete 和 delete 是静态的 我可以让它们成为非静态成员运算符吗 为什么需要它们是静态的 它们被隐式声明为静态 即使您没有键入 static
  • 为什么这个没有特殊字符的正则表达式会匹配更长的字符串?

    我正在使用此方法来尝试查找匹配项 例如 Regex Match A2 TS OIL TS OIL RegexOptions IgnoreCase Success 我得到了真实的结果 我很困惑 我认为这应该返回 false 因为模式中没有特殊
  • ASP.Net Core 内容配置附件/内联

    我正在从 WebAPI 控制器返回一个文件 Content Disposition 标头值自动设置为 附件 例如 处置 附件 文件名 30956 pdf 文件名 UTF 8 30956 pdf 当它设置为附件时 浏览器将要求保存文件而不是打
  • 在 JSQMessagesViewController 中显示 LocationMediaItem

    我刚刚尝试实施LocationMediaItem in my Xamarin iOS应用程序使用JSQMessagesViewController 一切都很顺利 唯一的问题是UICollectionView应该显示位置的单元格永远停留在加载
  • 检查 RoutedEvent 是否有任何处理程序

    我有一个自定义 Button 类 当单击它时 打开特定窗口 它总是执行相同的操作 我添加了一个可以在按钮的 XAML 中分配的 Click 事件 就像常规按钮一样 当它被单击时 我想执行 Click 事件处理程序 如果已分配 否则我想执行默
  • AES 输出是否小于输入?

    我想加密一个字符串并将其嵌入到 URL 中 因此我想确保加密的输出不大于输入 AES 是可行的方法吗 不可能创建任何始终会创建比输入更小的输出的算法 但可以将任何输出反转回输入 如果您允许 不大于输入 那么基本上您只是在谈论同构算法alwa
  • 如何通过 JsonConvert.DeserializeObject 在动态 JSON 中使用 null 条件运算符

    我正在使用 Newtonsoft 反序列化已知的 JSON 对象并从中检索一些值 如果存在 关键在于对象结构可能会不断变化 因此我使用动态来遍历结构并检索值 由于对象结构不断变化 我使用 null 条件运算符来遍历 JSON 代码看起来像这
  • 是否有相当于 Clang/LLVM 的 .spec 文件,在哪里可以找到参考?

    The gcc驱动程序可以配置为使用特定的链接器 特定的选项和其他细节 例如覆盖系统头 specs files 当前 截至撰写本文时 GCC 版本 4 9 0 的手册此处描述了规范文件 https gcc gnu org onlinedoc
  • 如何分析组合的 python 和 c 代码

    我有一个由多个 python 脚本组成的应用程序 其中一些脚本正在调用 C 代码 该应用程序现在的运行速度比以前慢得多 因此我想对其进行分析以查看问题所在 是否有工具 软件包或只是一种分析此类应用程序的方法 有一个工具可以将 python
  • 跨多个域的 ASP.NET 会话

    是否有合适的 NET 解决方案来在多个域上提供持久服务器会话 即 如果该网站的用户在 www site1 com 下登录 他们也将在 www site2 com 下登录 安全是我们正在开发的程序的一个问题 Thanks 它是否需要在会话中
  • 使用taskkill停止Windows服务

    我需要帮助来使用 C 终止 Windows 服务 现在要终止该服务 请使用以下选项 从命令 sc queryex ServiceName 发现后PID服务的 taskkill pid 1234 exemple f 为了便于阅读 但如果您明白
  • C++ Streambuf 方法可以抛出异常吗?

    我正在尝试找到一种方法来获取读取或写入流的字符数 即使存在错误并且读 写结束时间较短 该方法也是可靠的 我正在做这样的事情 return stream rdbuf gt sputn buffer buffer size 但如果streamb
  • 矩阵到数组 C#

    这将是转换方阵的最有效方法 例如 1 2 3 4 5 6 7 8 9 into 1 2 3 4 5 6 7 8 9 in c 我在做 int array2D new int 1 2 3 4 5 6 7 8 9 int array1D new
  • ASP.NET Core MVC 视图组件搜索路径

    在此处的文档中 https learn microsoft com en us aspnet core mvc views view components view aspnetcore 2 2 https learn microsoft

随机推荐

  • 如何捕获 PHP 中的 cURL 错误

    我在用PHP curl功能 https php net manual en ref curl php将数据从我的本地计算机发布到网络服务器 我的代码如下 c curl init curl setopt c CURLOPT URL url c
  • 动态创建消费者spring kafka

    我正在创建一个与另一个服务通信的服务 以便识别要收听的 kafka 主题 kafka主题可能有不同的键和值类型 因此 我想为每个配置 主题 键类型 值类型 动态创建不同的 kafka 消费者 其中配置仅在运行时已知 然而在 spring k
  • ASP.net kerberos 偶尔下降到 NTLM

    背景 仅相关部分 我们有一个大型 Intranet asp net 2 0 3 5 应用程序 Web服务器是AD域上的Windows Server 2003 客户端使用 Windows IE 6 8 Windows 身份验证 具有从 Win
  • PHP内部hashCode函数

    我正在寻找与 JAVA 等效的 PHP SomeString hashCode 功能 我正在寻找的 hashCode 应该与 PHP 中用于索引 Hashmap 的 hashCode 相同 我希望你可以帮助我 EDIT 好的 找到了我正在搜
  • WPF 重复按钮 MouseUp

    有没有办法让重复按钮上的 MouseUpevent 在不再按下按钮时触发 我试图使用 MouseMove 事件来跟踪按下按钮时鼠标的位置 但 MouseDown 和 MouseUp 都不会触发鼠标左键的事件 关于可以做什么的任何想法或建议
  • 如何将图像(位图)调整为给定尺寸? [复制]

    这个问题在这里已经有答案了 如何以编程方式将图像 位图 大小调整为例如 800 480 我在我的应用程序中检索了一张约 1MB 的图片 我需要将其缩小到 800 480 我已经加载了该图片并对其进行了压缩 但是如何使其变小 ByteArra
  • 选择组合框文本

    我有一个组合框声明如下
  • 将Pycharm项目移动到另一个目录

    我的主目录空间不足 我想将 PyCharm 项目移动到另一个目录 我最终复制了它 因为重构不起作用 我删除了 pycache 和 zip 异常 出现的异常消失了 现在一切都按预期工作 不过 从 settings python interpr
  • 如何使用 GitHub README 中的 Markdown 渲染多列?

    为了呈现三列中的项目 我尝试将以下 CSS3 指令添加到我的项目中README md文件 但样式被删除 div div style display inline block div div div div
  • 从我的应用程序创建日历事件,无需默认提醒

    我正在开发一个应用程序 可以创建 更新和删除原生 Google 日历中的事件 我正在通过以下代码创建一个事件 ContentValues cvEvent new ContentValues cvEvent put Events DTSTAR
  • `geom_line()` 连接映射到不同组的点

    我想group我的数据基于两个变量的相互作用 但仅将美学映射到其中一个变量 另一个变量代表重复 理论上 它们应该彼此相等 我可以找到不优雅的方法来做到这一点 但似乎应该有更优雅的方法来做到这一点 例如 Data frame with two
  • 如何使用 url_for() 将路径和查询数据传递到使用 FastAPI 和 Jinja2 的路由?

    我想从 Jinja2 模板中调用 FastAPI 路由 并传递两者path and query该路由的数据 参数 我在 Jinja2 模板中尝试过如下所示 url for function1 uustr data uustr interva
  • 从 R 中的 Sys.Date() 获取当前时间(包括秒)

    我确信这是非常基本的 但我无法从系统日期中提取各种时间 简而言之 我不确定为什么我无法使用 M 或 S 准确提取当前的分钟和秒数 有什么想法吗 我的机器上当前时间为中午 12 38 gt format Sys Date c 1 12 16
  • “冲突可序列化”和“冲突等效”有什么区别?

    在数据库理论中 冲突可序列化 和 冲突等效 有什么区别 我的教科书有一个关于可序列化冲突的部分 但掩盖了冲突等价性 这些可能都是我熟悉的概念 但我不熟悉术语 所以我正在寻找解释 DBMS 中的冲突可以定义为两个或多个不同的事务访问同一变量
  • 将带有变量的循环转换为 BigQuery SQL

    我有数千个脚本 其中包括循环数据集并使用变量进行累积 例如 assuming that ids is populated from some BQ table ids 1 2 3 4 5 var1 v1 initialize variabl
  • 如何使用 RealmSwift 存储字典?

    考虑以下模型 class Person Object dynamic var name let hobbies Dictionary
  • 清漆配置文件在哪里?

    我刚刚安装了清漆并准备好提供网页服务 问题是我们达到了打开文件限制 我们已经设定了ulimit给清漆用户 我们想要找到一个可以写入此配置的文件 Maximum number of open files NFILES 131072 Locke
  • ios7 UITableViewCell SelectionStyle 不会变回蓝色

    Xcode 5 0 iOS 7 并更新现有应用程序 UITableView所选行现在是灰色的 而不是蓝色的 据我所知 他们更改了默认值selectionStyle至灰色 但 蓝色 仍然是 IB 的一个选项UITableViewCellSel
  • 在内核模块中执行shell命令

    是否可以在内核模块中执行shell命令 我知道我们可以在用户空间 C 代码中使用system子程序 我正在调试一个存在内存泄漏问题的内核模块 在无限循环中执行 insmod 和 rmmod module ko 后 8G RAM 的系统在几分
  • boost Deadline_timer 最小示例:我应该替换“睡眠”吗?

    我有一个线程 我需要每 10 毫秒执行一些操作 所以我有非常简单的代码 如下所示 while work do something Sleep 10000 boost sleep can be also used 我听说Sleep一般不推荐