在线程中“浪费时间”最高效的 CPU 方式是什么?

2024-02-09

我有许多线程(100 个),每个线程一次执行几秒钟。当它们执行时,它们花费大量时间等待另一个系统(串行设备)的响应。我注意到,同时执行 100 个线程可能会占用大量资源,因此我实际上限制了可以同时启动的线程数量。

但我想到,在线程内等待外部事件的方法一定有好有坏。这种方法是 CPU 密集型的吗?:

send command ;
repeat
until response arrived ;
process response ;    

这种方法是否会提高效率?:

send command ;
repeat
    Sleep (20) ;
until response arrived ;
process response ;  

* 附加信息 *

环境是x86 Windows XP。线程代码是与串行设备的一系列漫长而复杂的交互,但一般来说,它包括将字符写入 COM 端口(使用 AsyncFree 串行库)并通过驻留在传入字符缓冲区上等待字符返回,当它们到达时对其进行处理。我想串行库可以使设备读取和写入。线程中的时间长则一分钟,短则几秒,但大部分时间都花在等待字符离开端口,或者等待响应字符(波特率慢),因此我的问题是线程在等待时的最佳行为方式。目前我正在打电话Sleep循环等待CharactersInBuffer变为非零,在每个字符到达时对其进行处理,并在获得完整响应时退出线程。所以代码看起来更像是(忽略超时处理等):

send command ;
Packet = '' ;
repeat

    repeat
        Sleep (20) ;
    until response character arrived ;
    build Packet

until complete packet arrived
process response ;  

如果线程确实正在等待类似 WaitForSingleObject 之类的东西,它不使用处理器时间,然后超时,则没有理由在线程中延迟睡眠。

您的用户不会等待线程响应,它不会使用处理器时间,并且其他线程不会被阻止,因此没有理由让线程休眠。

正如 David Heffernan 在他的评论中指出的那样,如果现在没有使用 100% 的 CPU,那么就没有问题。

如果您是单线程并且您必须偶尔在等待串行端口响应之间响应用户,则可以使用 sleep()。

此外,让线程休眠并不会提高效率。它只会将处理器周期让给其他线程。

看一眼sleep(0)作为在线程中“浪费时间”的 CPU 有效方式。

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

在线程中“浪费时间”最高效的 CPU 方式是什么? 的相关文章

  • 核心蓝牙框架本质上是异步的吗?

    当我在应用程序中使用 CB 框架时 我没有引入任何并发性或反应性方法 并且一切正常 当我每秒从外设接收超过 100 个样本时 UI 不会被阻止 这是否意味着它被设计为异步工作 我没有找到任何说明它具有异步性质的资源 也没有找到任何在使用核心
  • 在 Delphi 中获取 TCheckbox 的总大小,包括框和文本

    我想获得 TCheckbox 的总大小 包括 Delphi 中的框和文本 我查看这篇文章Delphi FMX TCheckbox TRadiobutton 自动调整大小 https stackoverflow com questions 4
  • Android中如何检测程序的终止?

    当 Windows 程序终止时 它会调用事件处理程序 例如 OnClose OnDestroy 和析构函数 Destroy 当我想保存一些 INI 设置时 这些地方就是我要保存的地方 我为所有这些事件编写了事件处理程序 但当我终止程序时它们
  • 使用 volatile 关键字时出现内存一致性错误的示例?

    来自文档 使用易失性变量可以降低内存一致性错误的风险 但这是否意味着有时易失性变量无法正常工作 奇怪的是它的使用方式 在我看来 这是非常糟糕的代码 有时工作有时不工作 我尝试谷歌 但没有找到易失性内存一致性错误的示例 您能推荐一个吗 问题不
  • Objective C 中最好的多线程方法?

    我正在开发一个 iPad 应用程序 目前正在努力寻找多线程的最佳方法 让我用一个简化的例子来说明这一点 我有一个包含 2 个子视图的视图 一个目录选择器和一个包含所选目录中所有图像缩略图的图库 由于 下载 和生成这些缩略图可能需要相当长的时
  • 新编译的应用程序需要 UAC/elevation?

    我有一个系统 我将其设置为普通的 UAC 并在我的 delphi 环境中编译名为 ka exe 的项目 并为其创建一个 installshield 项目 设置完毕 一切顺利 但每当我开始我的程序时 它都需要提升 而我不知道为什么 为了确保
  • IO 异常 - 读结束死 - 在此示例中导致它的原因以及如何修复它 - Java 中的多线程应用程序

    这是一扩大 https stackoverflow com questions 22180458 how to set boolean flag of thread 1 from thread 2 in java multithreadin
  • Java 中的 LRU 缓存实现

    我看过下面的代码 我认为addElement方法的实现中有一个无用的while循环 它永远不应该有比 size 1 更多的元素 因为已经有一个写锁 那么为什么 addElement 方法会删除元素直到它达到这个条件 真的 while con
  • 我可以在 Delphi 中使用字符串“IsEmpty”方法吗

    内河码头文件 IsEmpty 方法 http docs embarcadero com products rad studio delphiAndcpp2009 HelpUpdate2 EN html delphivclwin32 Syst
  • Delphi 是否在构造对象之前分配变量?

    Delphi 是否在对象完全构造之前分配实例变量 换句话说 给定一个变量 var customer TCustomer nil 然后我们构造一个客户并将其分配给变量 customer TCustomer Create 有没有可能custom
  • 如何检查文件是否有备用数据流?

    Delphi 有没有办法检查文件是否有任何备用数据流 看一下 Win32 APIFindFirstStreamW https msdn microsoft com en us library windows desktop aa364424
  • 我有进程 ID,需要使用 Delphi 5 以编程方式关闭关联进程

    任何人都可以帮我提供一个编码示例 以便在我拥有进程 ID 时关闭关联的进程 我将使用 Delphi 5 在 Windows 2003 服务器上以编程方式执行此操作 如果您有进程 ID 并希望强制终止该进程 可以使用以下代码 function
  • 在 ADO 查询 (mysql/MyConnector) 中使用参数

    今天我下载并安装了 MyConnector 这样我就可以通过 ADO 使用 Mysql 一切都安装好了 我可以与 ODBC 连接并从我的 delphi 环境进行连接 当我在运行时构建查询时 我收到一条错误消息 项目 Project1 exe
  • 从ndk中的不同线程调用java方法

    我正在尝试使用 android 的 NDK 从 C 中的独立线程调用 java 静态方法 到目前为止我已经 JNIEnv env AttachJava jclass cls2 env gt FindClass com actvt showd
  • 如何让node.js中的线程休眠而不影响其他线程?

    As per 了解 Node js 事件循环 http blog mixu net 2011 02 01 understanding the node js event loop node js支持单线程模型 这意味着如果我向 Node j
  • 在后台线程上搜索

    我试图在 iPhone 应用程序中搜索数千个对象 但是搜索严重滞后 每次击键后 UI 都会冻结 1 2 秒 为了防止这种情况 我必须在后台线程上执行搜索 我想知道是否有人有一些在后台线程上搜索的提示 我读了一点NSOperation并在网上
  • JFrame 在连续运行代码时冻结

    我在使用时遇到问题JFrame 它会冻结 连续运行代码 下面是我的代码 点击时btnRun 我调用了该函数MainLoop ActionListener btnRun Click new ActionListener Override pu
  • BufferBlock 连续

    我想使用以下方式实现消费者 生产者模式BufferBlock
  • Delphi XE5 FireDAC 错误:无法加载供应商库 [libmysql.dll 或 libmysqld.dll]

    我在 Windows 7 64 位上使用 Delphi XE5 只是尝试 FireDAC 组件 我正在使用一个 TFDConnection 组件连接到本地 MySQL 数据库 v5 6 15 我已经将 libmysql dll 32位 v5
  • 何时分离或加入 boost 线程?

    我有一个方法 大约每 30 秒触发一次 我需要在一个线程中包含它 我有一个可以从类外调用的方法 像 call Threaded Method 这样的东西会创建一个线程 该线程本身会调用最终的线程方法 这些是 MyClass 的方法 void

随机推荐

  • 比较大型集合的 i4o 与 PLINQ

    我有一个问题想问任何有 i4o 或 PLINQ 经验的人 我有一个大对象集合 大约 400K 需要查询 逻辑非常简单明了 例如 有一个 Person 对象的集合 我需要找到与相同的名字 姓氏 出生日期或名字 姓氏的第一个首字母等匹配的人员
  • Firebase Cloud Functions 模拟器抛出“退出代码:1”错误

    我正在尝试设置本地环境来测试 firebase 云功能 我跟着一起他们的文档 https firebase google com docs functions local emulator但现在遇到以下错误 错误 firestore 模拟器
  • 代码::Blocks/ Dev-c++: 错误: iostream: 没有这样的文件或目录

    我从这里下载了 Code Blocks http www codeblocks org downloads 26 http www codeblocks org downloads 26 我正在学习c编程 当我运行以下程序时 出现错误 io
  • C 中的短整型文字

    为什么 C 中没有短整型文字 在 C 中使用短 int 文字是没有意义的 因为所有整数表达式都会被计算 就好像子表达式的大小至少为 int 一样
  • 输入元素上的 Autocapitalize 属性(用于 iOS)会破坏验证

    可以看出here http www evotech net blog category html Safari 和 iPhone 版 Safari 支持所有 HTML 元素 包括已弃用的元素 甚至一些从未属于任何 W3C 规范的专有元素 它
  • 南非身份证号码验证并获取年龄和性别

    我对此进行了研究 但我使用的代码似乎都不起作用 南非身份证号码包含出生日期和性别 我想要的只是在输入字段中输入他们的 ID 号时提取该信息并验证它 最好是使用 jQuery 或 javascript 任何帮助表示赞赏 Dawid 您可以使用
  • 如何使用geom_vline和geom_histogram r ggplot2从填充比例图例中删除线条

    基本 使用R统计软件ggplot2 geom vline和geom histogram可视化一些数据 问题出在图例键上 我试图从一些随机模拟中绘制一对直方图 并在其之上绘制几条代表确定性模拟结果的线 我已经绘制了数据 但直方图的图例键中间有
  • 具有 AJAX 功能的 jQuery 循环插件

    我有一个页面 其中有多个图片滑块 例如 50 个滑块 每个滑块有 5 10 张图片 不幸的是 由于滑块数量巨大 页面加载速度非常慢 到目前为止 我一直在使用 Malsup 著名的 jQuery Cycle 插件 然而 这缺乏 AJAX 功能
  • 如何在 Visual Studio 2019 中将当前分支与另一个分支进行比较?

    在 Visual Studio 中 假设以下场景 从 master 创建一个分支 做一些改变 Commit 再次进行一些更改 Commit 当我们进行提交时 下面没有显示任何更改团队资源管理器 gt 更改 如果我们不执行第 5 步Chang
  • 为什么 AWS Lambda 无法到达 FunctionHandler?

    I am 首次将 C 应用程序部署到 Lambda 使用 Mac 因此无法使用 Visual StudioAWS 工具包扩展 https marketplace visualstudio com items itemName AmazonW
  • AngularJS 在表单输入上输入指令时不保存模型值

    我在页面上有以下内容 完整代码在此Plunker http plnkr co edit NZMC0Km3pFUBGXgcVopx p preview 有一个习俗onEnter当在聊天表单输入上按 Enter 键时调用函数的指令 下面的代码片
  • 使用 Websockets 代替 RESTful HTTP 有哪些陷阱?

    我目前正在开发一个项目 需要客户端请求一个大作业并将其发送到服务器 然后 服务器划分作业并以一组 url 进行响应 以便客户端进行 GET 调用并流回数据 我是该项目的新手 目前正在使用 Spring websockets 来提高效率 We
  • 如何让两个div并排对齐? [复制]

    这个问题在这里已经有答案了 我一直试图让两个 div 并排浮动 或者基本上是购物车和物品 即 jcart 和 cartbox 但似乎无法得到它 这是演示 link http asiraj com 我尝试改变float right 在购物车
  • C - 确定使用哪个分隔符 - strtok()

    假设我正在使用strtok 像这样 char token strtok input 有没有办法确定实际使用了哪个令牌 例如 如果输入类似于 Hello there How are you I m good End 我可以找出每个标记使用了哪
  • Angular 2 Setter 和 Getter

    我正在尝试创建一个服务来将数据解析到不同路线上的不同组件 如果我在同一组件上调用后续服务 我会得到所需的结果 但如果我尝试从另一个组件获取设置的结果 该服务将返回未定义的结果 这是我的服务 import Injectable from an
  • 位移位的目的是什么? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我在代码中遇到了以下几行 unsig
  • 如何在 Phonegap 3 上使用 plugin.xml 复制自定义 ios 框架

    我目前正在为phonegap 3 制作一个插件 我有一个自定义框架可以使用源文件指令进行复制 在plugin xml中我尝试过
  • 绑定与 SO_BINDTODEVICE 套接字

    我正在 linux ubuntu 13 10 上运行一个项目 它使用原始套接字连接到设备 这是我的代码 builed socket if sockfd socket PF PACKET SOCK RAW htons ETH P ALL 1
  • .Net框架4.0 SDK

    有谁知道是否有 Net 4 0 框架的 SDK 如果有 安装程序将其放在硬盘驱动器的哪个位置 我已经安装了 Visual Studio 2010 旗舰版 但在任何地方都找不到 SDK NET SDK 的最后一个独立版本是 2 0 之后它与W
  • 在线程中“浪费时间”最高效的 CPU 方式是什么?

    我有许多线程 100 个 每个线程一次执行几秒钟 当它们执行时 它们花费大量时间等待另一个系统 串行设备 的响应 我注意到 同时执行 100 个线程可能会占用大量资源 因此我实际上限制了可以同时启动的线程数量 但我想到 在线程内等待外部事件