【问题标题】:What is the role of a Thread in operating system context?线程在操作系统上下文中的作用是什么?
【发布时间】:2019-12-05 17:53:00
【问题描述】:

我试图了解Async 编程和Multi Threaded 编程之间的区别。在async 中,我们说线程接受一个任务(T1)并开始执行它。如果同时另一个任务 (T2) 出现,它不会等待 T1 完成,它会在 T1 在后台执行时选择第二个任务 T2。

突出显示的部分是我最困惑的部分 大约。那么当线程拿起 T2 时,谁在执行 T1?是什么 线程在操作系统上下文中的作用?它的具体作用是什么?

这可能是个愚蠢的问题,但我在互联网上长达数小时的折磨并没有让我满意。还是我只是问错了问题?

【问题讨论】:

标签: c# multithreading asynchronous operating-system


【解决方案1】:

实际上,混淆来自于任务 T1 在后台执行的想法。您所写的场景只有在 T1 是一个 IO 绑定任务时才有可能,因此它不占用线程(因此它没有执行,而是等待来自某个 IO 设备驱动程序的结果) IO 操作正在运行。在这种情况下,线程不忙并且可以选择其他工作。

如果您有一个纯 CPU 密集型任务,它总是需要一个线程来运行。如果您想将此操作卸载到 ThreadPool 线程(例如,为了通过从主 UI 线程卸载工作来保持您的 UI 响应),一个常见的模式是使用 Task.Run

await Task.Run(/* your CPU-bound method call here */);

我发现 Stephen Cleary 的解释在异步/等待、任务、TPL 等方面非常有用。因此,您可能需要以下链接以获得更详细的解释:

  • There is no Thread - 在这里您将找到关于异步执行时如何可能没有线程的简要说明
  • A Tour of Task - 这是一系列精彩的文章,解释了委托任务和承诺任务

在我看来,当你更深入地挖掘一个层次时,它总是有回报的,在 async / await 的情况下,这将是经典的线程。有一个很棒的(免费的)Threading in C# by Joseph Albahari。在那里你会找到关于线程、同步、并行编程的所有重要细节。

【讨论】:

  • T1 也可能在 I/O 之外的其他东西上被阻塞。
  • @Stas Ivanov。那么我们是说如果等待的任务是 CPU 绑定的,那么会有另一个线程或同一个线程会继续执行等待的任务,从而使方法同步运行?
  • @Dhiren 完全正确。为了在另一个线程上异步运行受 CPU 限制的操作,您可能会使用 await Task.Run(...),那么它通常是执行的 ThreadPool 线程。如果任务是纯 CPU 绑定的(内部没有 await)并且没有像 Task.Run() 那样显式卸载到另一个线程,那么它将在同一个线程上同步执行。
  • @StasIvanov 谢谢。我想我已经理解了,尽管我仍然有很多点要连接。我对它了解得越多,我知道的就越少。您认为完全掌握异步/多线程/并行编程的前提是什么?
  • @Dhiren,我相信深入挖掘一个层次总是值得的,在 async / await 的情况下,这将是经典线程。约瑟夫·阿巴拉哈里 (Joseph Ablahari) 在这里有一篇关于该主题的精彩(免费)阅读:albahari.com/threading。除此之外,仔细看看 Stephen Cleary 和 Jon Skeet 就该主题所写的内容是有意义的。
【解决方案2】:

大概如果async 编程异步编程意味着它仅意味着当某些事件可能以未严格定义的顺序发生时对计算流进行编程,周期。从这个角度来看,两种机制:线程和 I/O 都是异步的。但是 .NET async 机制与它们没有直接关系。本质上,它只是一个框架,以一种模仿同步执行但保持异步语义的形式包装类异步计算。也就是说,它不控制底层操作是异步还是同步(它由操作本身控制),甚至可以成功应用于这两种类型的操作,但与异步操作一起使用它更有利,这可能是为什么开发人员将这种机制与异步编程密切相关。所以你的问题的答案是“这取决于”。在 I/O 绑定异步操作的情况下,它的 IO 子系统以及 I/O 设备可以在 T2 被拾取并执行时提供 T1 的执行。在 CPU 密集型异步操作的情况下,它可以是另一个线程。如果操作是同步的,它们将一个一个地执行,即同步。

【讨论】:

  • 谢谢队友 :) 但我仍然认为在我完全理解之前我必须好好阅读它。您能帮我指出正确的方向吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-22
  • 2020-09-25
  • 2012-02-06
  • 2011-05-24
  • 2020-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多