多线程如何在 C 中实现?
Posted crazy_itman
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程如何在 C 中实现?相关的知识,希望对你有一定的参考价值。
多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。软件多线程。即便处理器只能运行一个线程,操作系统也可以通过快速的在不同线程之间进行切换,由于时间间隔很小,来给用户造成一种多个线程同时运行的假象。这样的程序运行机制被称为软件多线程。如微软的Windows作业系统和Linux就是在各个不同的线程间来回切换,被称为单人多任务作业系统。而DOS这类文字接口作业系统在一个时间只能处理一项工作,被视为单人单工作业系统。
除此之外,许多系统及处理器也支持硬件多线程技术。对称多处理机(SMP)系统具有多个处理器,所以具有真正的同时执行多个线程的能力;CMP技术通过在一块芯片上集成多个核心(Core)也具有真正的多线程能力;CMT技术则稍有不同,有的是依靠硬件执行线程切换来获得多线程能力,操作系统不再负责线程切换,因而这部分开销可以减少甚至消除,这方面典型的例子是Sun的UltraSPARC T1,它同时综合了CMP和CMT。微软的Windows 2000以后的操作系统皆支持多线程与超线程技术。
我如何从零知识开始计算机编程?
我建议学习编程的人从学习 C 开始。与大多数其他语言相比,C 是一种相对低级的语言。(从技术上讲,它被称为“高级语言”,但仅与机器语言和汇编语言进行比较。)C“接近金属”,因为它的语句非常接近必须翻译的机器语言语句在程序运行之前由 C 编译器编译。这教会了学生很多关于计算机如何分配内存、它们如何存储和检索数据、它们如何做出决定以及它们如何进行数学运算的知识。
学习 C 首先会给一个人应有的坚实基础知识,即使一个人打算只进行应用程序编程。否则,如果您的雇主要求您编写设备驱动程序或通信功能或某些嵌入式固件,会发生什么情况?你将无法做到!您的雇主将不得不雇用其他人。猜猜谁会晋升?不是你。所以先学C。不是因为它简单(不是)或安全(不是)或一种好的语言(不是),而是因为它是低级的(它允许您编写固件、驱动程序、编译器和操作系统)和无处不在(它被大量使用,并且它的编译器已经存在于地球上几乎每台计算机上)。
然后学习C++,只是基础知识。尤其要学习 STL 及其容器、算法和迭代器。但是现在跳过 OOP 部分;OOP 并不像吹嘘的那样,此外,您以后总是可以学习这部分内容。
然后学习 Perl 5,并将它用于涉及文本、Unicode、文件或系统管理的任何事情,因为它擅长这些任务(这些任务恰好是几乎所有其他编程语言所擅长的任务)。忽略批评者(他们很多,主要是 Python 狂热分子)。Perl 是 TIMTOWTDI(不止一种方法)的语言,是现存最好的计算机编程语言之一。并且不要对印记 ($@%&) 发脾气;您最终会爱上它们,因为它们是该语言的最佳功能,因为它们巧妙地将名词与动词分开。(Perl 很大程度上基于人类语言。)
然后学习 Python 3,并将其用于几乎所有其他方面(通信、应用程序、数学、科学等)。如果您没有充分的理由使用其他语言进行编程,那么 Python 应该是您的首选语言。它的语法看起来很干净(但要非常小心空格,因为它们很重要)。不过,不要将 Python 用于文本、Unicode、文件或系统管理;Python 很烂;对那些使用 Perl。
然后,在您开始专业编程之后,根据需要学习您需要学习的任何其他内容。
您会使用 Rust 而不是 C++ 或 C 的一些原因是什么?
人们可能选择使用 Rust 而不是 C++ 或 C 有几个原因:
内存安全:Rust 具有内置的内存安全保证,有助于防止常见的编程错误,如空指针取消引用和缓冲区溢出。这使得 Rust 程序更安全,更不容易发生崩溃和漏洞。
并发性:Rust 对并发编程有很强的支持,使得编写正确高效的多线程代码变得更加容易。
性能:由于其现代设计和内存安全保证,Rust 可以生成与 C++ 相当的高性能代码,并且通常比等效的 C 代码更快。
生产力:Rust 的现代设计和语法,结合其对可读性和可维护性的强调,与 C++ 或 C 相比,可以提高开发人员的生产力。
现代特性:Rust 包括泛型、模式匹配和函数式编程范例等现代特性,使其成为比 C++ 或 C 更具表现力和灵活性的语言。
更好的错误处理:Rust 的错误处理模型,基于 Result 类型和?运算符,可以更容易地编写正确的错误处理代码并降低引入错误的风险。
在为微控制器编写程序时使用 C 而不是汇编语言有几个缺点:
代码大小:用 C 编写的程序通常比用汇编编写的程序大,这对于内存有限的微控制器来说可能是个问题。
执行速度:用 C 编写的程序可能比用汇编编写的程序运行得慢,因为 C 编译器可能生成效率较低的代码。
减少控制:汇编语言提供了对微控制器硬件的更直接控制,而 C 抽象出一些底层细节。
对硬件的了解有限:不熟悉底层硬件的程序员可能难以理解其 C 代码的行为,尤其是在涉及低级操作时。
复杂性:C 程序通常比汇编程序更复杂,这使得它们更难调试和维护。
多线程如何在 C 中实现?
多线程是一种计算机编程技术,它允许程序员同时执行两组或更多组指令(命令)。该技术的目标是通过分配工作更快地获得计算结果。要实现多线程,操作系统必须支持它。C 本身和任何计算机语言都不提供多线程功能。C++ 或 Python 等语言只包含操作系统设施的包装器。通常,操作系统通过一个或多个库提供 API,您的程序可以使用这些库来创建、启动、同步和终止线程。例如,pthread 库可以用在用 C 编写的程序中。简而言之,如果你想使用多线程,通常你会编写 C 代码来
创建一个或多个线程(从操作系统分配资源),指定一个函数及其参数,您打算将其作为一组单独的命令(线程)执行,以两种模式之一开始执行功能,所谓的“加入”或“分离”,等待所有线程完成,然后收集并处理它们的结果,销毁创建的线程(将资源返回给操作系统)。通常,任何旨在由操作系统运行的程序都包含一个线程。main函数在这个线程(称为主线程)中执行。因此,您开始从主线程创建并运行其他线程。
进程是正在运行的程序的实例。可以同时运行多个进程的操作系统称为多程序或多任务系统。一个给定的程序可以有多个进程。例如,您可以在 MacOS 或 Linux 上打开多个终端窗口,或者在 Windows 上运行多个 CMD shell。每个终端窗口都是同一终端或 CMD.exe 程序的单独运行实例。进程相互独立;他们每个人都有自己独立的地址空间,所以在一个进程中发生的事情通常不会影响其他进程(它可能会发生,但这超出了这个答案的范围)。为了让多个进程在单个 CPU(或一组 CPU 内核)上同时运行,每个进程一次运行几微秒,然后在其他进程开始运行时挂起。这种切换发生得很快,在我们看来所有程序都在同时平稳运行。
在一个进程中,您有一个或多个执行线程。任何允许您在一个进程中运行多个线程的系统都是多线程系统。与进程不同,线程不是相互独立的——它们都在相同的地址空间中运行,并且可能会修改内存中的相同对象。像进程一样,通过给每个线程一点 CPU 时间来执行多个线程,然后在其他线程运行时挂起它 - 这是由操作系统处理的。由于不同的线程可以修改相同的对象,因此您通常需要在线程之间实现某种同步,使用信号量或互斥量来锁定关键部分,以便一次只有一个线程可以访问一个对象。在 C11 之前,您必须使用特定于系统的库或第三方库在 C 中实现多线程。POSIX 兼容系统提供了pthreads库. C11引入了原生threads库这与 pthreads 的行为方式非常相似。
以上是关于多线程如何在 C 中实现?的主要内容,如果未能解决你的问题,请参考以下文章