C中的多线程实现本身

Multithreading implementation itself in C

我是初学者C/C++首先是程序员,但我对此很好奇。 我的问题比较理论化。

我听说 C 没有明确的多线程 (MT) 支持,但是有实现此功能的库。我发现 "process.h" header 必须包含在构建 MT 程序中,但我不明白的是 MT 本身是如何工作的。

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

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

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

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

抱歉,如果之前回答过,或者问题太复杂了:)

更新: 想象一下我们有 C 语言。它有函数、变量、指针等。我不知道任何 "special" 函数类型可以 运行 与其他函数类型同时使用。除非它调用了一些其他函数。但是然后调用函数停止并等待? 是不是当我 运行 MT 应用程序时,有一个特殊的 "global" 函数重复调用我的 f1() 和 f2() 看起来它们同时工作?

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

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

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

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

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

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

在 Linux 上是一样的,只是带有系统调用的函数被调用 clone