单线程可以执行多线程可以执行的所有操作吗?

时间:2015-11-27 10:14:16

标签: multithreading single-threaded

我的第一个问题:根据标题。

我问这个是因为我遇到了StackExchange问​​题:What can multiple threads do that a single thread cannot?

在该链接中给出的一个解决方案中指出无论多线程可以做什么,它也可以通过单线程来完成。

但我不认为这是真的。我的论点是:当我们使用套接字编程构建一个简单的聊天程序并通过命令控制台运行它。如果聊天程序是单线程的。聊天程序实际上是半双工的。这意味着我们不能同时倾听和谈话,每次只有一方可以说话而另一方必须倾听。为了使双方能够同时交谈和接收消息,我们必须使用多线程来实现它。

我的第二个问题:我的论点是否正确?或者我在这里错过了一些观点,因此单个线程仍可以完成多线程的所有操作吗?

3 个答案:

答案 0 :(得分:4)

让我们将计算机视为一个整体,更准确地说,您聊天应用程序与内核(或整个操作系统)绑定在一起我们称之为&#34;软件&#34;。< / p>

现在考虑一下这个&#34;软件&#34;运行在一个核心(比如i386)。

然后你可以弄清楚,即使你使用线程编写你的聊天应用程序(这可能相当矫枉过正),整个软件也会运行在单个CPU核心上,这意味着它在很短的时间内执行一个即使似乎有并行的事情发生了。

这仅仅是图灵机(使用单个磁带)https://en.wikipedia.org/wiki/Turing_machine

并行性是由内核引起的错觉,因为它可以足够快地在任务之间切换。就像电影似乎是连续画面在屏幕上,实际上每秒只有24​​张图像,这足以愚弄我们的大脑。

所以我会说任何多线程程序都可以做,单线程可以做。

尽管如此,现在我们都使用多核CPU,可以在某个时刻看到同时在多台计算机上运行(并行计算),因此您可能会发现可以在多核上工作的软件在单线程上运行。 一个很好的例子是设备驱动程序(在内核中)。如果您的实现很差,在非抢占式内核上,您可以创建一个无限期等待事件的繁忙循环。这通常是单核上的死锁(您阻止内核安排到另一个任务,因此您可以阻止发送事件)。但是这可以在多核上运行,因为事件通常最终由在另一个核心上运行的另一个线程发送(希望如此)。

答案 1 :(得分:2)

我想修改现有的答案(+1):

您绝对可以在一个线程上运行多个并行IO。 IO只不过是内核数据结构。当您启动IO时,操作系统会与硬件通信并告诉它执行某些操作。然后,CPU可以随意做任何事情。硬件完成后会回调操作系统。它发出一个中断,劫持CPU核心来处理完成通知。

这称为异步IO,所有操作系统都提供它。

实际上这就是运行多个连接的套接字程序的方式。他们使用异步IO将大量连接复用到一小块线程上。

答案 2 :(得分:1)

这个论点不正确的核心原因是微妙的。虽然仅使用单个线程,单核或单个网络接口,但该特定组件只能在任何给定时间处理发送或接收,如果它不是关键路径,将整个系统描述为半双工是没有意义的。

考虑一个全双工的网络链接,需要1ms才能将一大块数据从一端移动到另一端。现在假设我们有一个设备可以将数据放在链接上或从链接中删除数据但不能同时执行这两个操作。只要处理发送或接收所需的时间少于1毫秒,这两个方向上的数据必须通过的单个文件路径以某种方式使链路半双工。仍然会同时向两个方向移动数据。

在任何真实的聊天应用程序中,CPU都不是限制因素。因此,它不能一次做多件事就不能使系统半双工。仍然可以同时向两个方向移动数据。

对于典型加载下的典型聊天应用程序,无论实现使用单个线程还是具有无限CPU资源的多个线程,系统的行为都不会有显着差异。 CPU不会成为限制因素。