【问题标题】:Multithreading implementation itself in CC中的多线程实现本身
【发布时间】:2015-07-05 16:58:48
【问题描述】:

我首先是一个初学者 C/C++ 程序员,但我对此很好奇。 我的问题更具理论性。

我听说 C 没有显式的多线程 (MT) 支持,但是有一些库可以实现这一点。我找到了构建 MT 程序必须包含的“process.h”标头,但我不明白的是 MT 本身是如何工作的。

我知道 CPU 中有线程(为简单起见假设它是单核)正在运行,并且每分钟只有一个线程。 CPU 在线程之间切换的速度非常快,因此用户将其视为同时工作(如果不是,请纠正我)。

但是 - 当我写下以下内容时真正发生了什么

beginthread( Thread, 0, NULL ) //or whatever function/class method we use

请记住,C 不支持 MT。我的意思是,代码如何告诉 PC 多线程运行两个函数,而语言显式方法无法实现? 我猜在与“process.h”相关的库中存在一些“作弊”,但那是什么作弊,我不能只在网上找到。 更具体地说——我不是在问如何使用 MT,而是在问它是如何构建的?

对不起,如果之前回答过,或者问题太复杂:)

更新: 假设我们有 C 语言。它有函数、变量、指针等。我不知道任何可以与其他函数同时运行的“特殊”函数类型。除非它调用了其他一些函数。但是调用者函数停止并等待? 是不是这样,当我运行 MT 应用程序时,有一个特殊的“全局”函数会重复调用我的 f1() 和 f2(),看起来它们是同时工作的?

【问题讨论】:

  • C 确实有明确的多线程支持,只是#include <thread.h>。
  • 线程不是处理器的一部分。这是一个与操作系统调度程序有关的概念。多线程涉及与调度程序交互。
  • @KerrekSB 你在用什么编译器,支持thread.h?
  • Kerrek SB,是的,我理解你的意思是操作系统正在处理处理器线程,所以我的代码不直接与 CPU 通信,但仍然有什么诀窍,这就是我没有得到的。
  • @this:我没有使用任何编译器。我在评论 C :-)

标签: c multithreading implementation


【解决方案1】:

首先,C11确实在标准中加入了多线程支持,所以C不支持多线程的前提已经不完全正确了。

但是,我假设您的问题更多地与当标准 C 确实(/没有)提供必要的工具时 C 库如何实现多线程有关。答案在于“标准”这个词——编译器和平台可以提供超出标准要求的附加功能。使用这些额外的特性会降低程序/库的可移植性(即,需要比 C 标准中指定的更多),但语言和函数调用语义仍然可以是 C。

也许考虑一个标准库函数(例如fopen)会有所帮助——最终必须调用该函数代码内部的某个地方,而该代码无法用标准 C 编写,即标准库本身的实现也必须依赖于用于访问操作系统功能(例如文件系统)的特定于平台的代码。因此,标准库的每个实现都必须以特定于该平台的方式实现不可移植部分(这是拥有标准库而不是所有代码都是平台特定的点)。但同样,多线程库可以使用该平台提供的非标准特性来实现,但使用这样的库会使代码只能移植到具有相同(或兼容)多线程库可用的平台。

至于多线程本身是如何工作的,当然不在本文所能回答的范围之内,但作为单处理器内核上的简化概念模型,你可以想象操作系统通过运行一个进程来管理“并发”进程短时间,中断它,保存它的状态(当前指令,寄存器等),加载另一个进程的保存状态,然后重复这个。这给人一种并发执行的错觉,尽管实际上它在不同进程之间快速切换。在多核系统上,不同核上的执行实际上可以是并发的,但是进程通常比核数多,所以这种切换仍然会发生在单个核上。等待某事的进程(I/O、另一个进程、计时器等)使事情变得更加复杂。也许可以说调度程序是一个在操作系统内部管理所有这些的软件,多线程库与之通信就足够了。

(请注意,实现多线程和多任务的方式有很多种,上一段中的陈述并不适用于所有方式。)

【讨论】:

  • fopen的例子很有用,我想我现在明白了,但有些东西还不清楚。
  • 你答案的最后一段似乎正是我想要的!谢谢!
【解决方案2】:

它是特定于平台的。在 Windows 上,它最终会下降到 NtCreateThread,它使用汇编指令 syscall 来调用操作系统。因此,您可以将其定性为作弊。

在 Linux 上也是如此,只是带有系统调用的函数被称为 clone。

【讨论】:

  • 这看起来很有希望,所以系统调用是对操作系统服务的一些调用,这使得我的应用程序在 MT 模式下运行?操作系统是否有某种“无限循环”——一个处理程序,然后可以在我的两个功能之间切换,将它们提供给处理器?
  • @elldissin:操作系统经常使用所谓的时钟中断来中断正常代码。当足够的时间过去时,它会在它的线程列表中查找并运行下一个优先级。系统调用仅用于添加到该列表中。
  • 谢谢!现在我明白了,至少对于我的知识水平来说足够了:)
猜你喜欢
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
  • 2011-07-25
  • 1970-01-01
相关资源
最近更新 更多