【问题标题】:Worker Thread CPU-bound工作线程 CPU 密集型
【发布时间】:2011-04-07 02:15:52
【问题描述】:

我有一个正在侦听端口的 TCP/IP 线程(主线程)。当 TCP/IP 请求到来时,我会生成一个线程来处理该请求。如果工作线程是 CPU 绑定的(想象一个从 1 到 1000000 的循环什么都不做),我无法接收另一个 tcp/ip 请求。SO 不会给监听线程一个切片时间。

我该如何解决这个问题?这是一个实施问题吗?当 tcp/ip 数据包进入 tcp/ip 栈时,SO 必须给监听线程一个 slice 时间吗?

谢谢!

【问题讨论】:

  • 您使用的是哪些组件?
  • 我使用的是 Delphi 标准库的 TThread。
  • 如果侦听器和工作线程具有相同的优先级,则不可能发生您所描述的 - 操作系统将执行侦听器线程,并且在工作人员正在烧毁您的 CPU 时它将能够接受其他请求或一些核心。确保您实际上是在另一个线程中完成工作任务!否则,您将不会在工作完成之前在侦听器套接字上调用 accept()。也许您应该从侦听器线程中添加一些代码?

标签: windows multithreading delphi cpu-usage worker


【解决方案1】:

在工作线程中使用 WinAPI 函数 SwitchToThread()Sleep(0),以便将其时间片放弃给系统中的其他线程/进程。或者在 Delphi 中,使用TThread.Yield

【讨论】:

  • 这是解决方案吗?程序员负责在线程内创建代码。因此,如果他执行 while(true) 循环,我将无法接收其他 TCP/IP 连接。
  • 这是否意味着您无法控制 CPU 绑定线程的功能?如果是这样就太糟糕了。提高监听线程的优先级可能会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-28
  • 2020-10-11
  • 2012-09-24
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多