c - C中的多线程实现本身

标签 c multithreading implementation

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

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

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

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

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

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

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

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

最佳答案

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

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

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

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

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

关于c - C中的多线程实现本身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31232813/

相关文章:

java - 使用 FileLock 在 Java 中锁定文件

java - 为 GUI 创建一个通用接口(interface),让它由许多类实现

c# - 当 T 可以是 IEnumerable<T> 时实现 IEquatable<T>

c - 我的 C 数组测试程序无法运行

c - 错误 : control may reach end of non-void function in C

c - 在c中使用POSIX Semaphore进行多线程

c# - 多线程访问内存

algorithm - Minhash 实现如何找到排列的哈希函数

c - sleep() 函数未按预期工作

c 编程 : need fresh eyes to look at this [demo code ! = 作业]