多线程如何在c中实现?

crazy_itman crazy_itman     2023-03-02     754

关键词:

多线程(英语: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/C++ 中实现内存管理器?

】在具有动态大小的内存池的多线程C/C++中实现内存管理器?【英文标题】:ImplementingamemorymanagerinmultithreadedC/C++withdynamicallysizedmemorypool?【发布时间】:2013-06-2520:00:10【问题描述】:背景:我正在开发一种多平台框架,将用作game... 查看详情

如何在多线程应用程序中实现 100% 的 CPU 使用率?

】如何在多线程应用程序中实现100%的CPU使用率?【英文标题】:Howtoachieve100%CPUusageinmultithreadedapplication?【发布时间】:2017-11-0314:09:14【问题描述】:我有大约100个文本文件,每个200MB,我需要解析它们。下面的程序加载文件并并... 查看详情

如何在 C 中实现多分支树结构

】如何在C中实现多分支树结构【英文标题】:HowtoimplementamultibranchtreestructureinC【发布时间】:2011-08-2713:14:14【问题描述】:我很久没有用C写代码了。我正在尝试做一棵多叶树。我正在尝试将C#trie实现转换为C,以便使用CUDA在GPU... 查看详情

java示例代码_在Java中实现多线程池

java示例代码_在Java中实现多线程池 查看详情

如何在 C 中实现回调函数?

】如何在C中实现回调函数?【英文标题】:HowdoIimplementcallbackfunctionsinC?【发布时间】:2010-05-0814:59:11【问题描述】:gcc4.4.3c89我正在创建一个客户端服务器应用程序,我需要实现一些回调函数。但是,我在回调方面没有太多经验... 查看详情

如何在android的jni线程中实现回调

JNI回调是指在c/c++代码中调用java函数,当在c/c++的线程中执行回调函数时,会导致回调失败。其中一种在Android系统的解决方案是:把c/c++中所有线程的创建,由pthread_create函数替换为由Java层的创建线程的函数AndroidRuntime::createJavaTh... 查看详情

在 C++ 中实现高效的多线程文件 I/O

】在C++中实现高效的多线程文件I/O【英文标题】:ImplementingefficientmultithreadedfileI/OinC++【发布时间】:2011-11-0523:08:21【问题描述】:我目前正在开发一个自定义跨平台文件服务器(C++,boost)。显然,它会大量对HDD进行读取和写入... 查看详情

在 MFC 中实现多线程以更新外部函数可访问的内部字典

】在MFC中实现多线程以更新外部函数可访问的内部字典【英文标题】:ImplementingMultithreadinginMFCtoupdateaninternaldictionaryaccessiblebyoutsidefunctions【发布时间】:2011-12-2017:54:15【问题描述】:我正在使用C++和MFC创建一个应用程序,该应用... 查看详情

如何在 C# 中实现线程关联?

】如何在C#中实现线程关联?【英文标题】:HowdoIimplementthreadaffinityinC#?【发布时间】:2017-12-1422:09:33【问题描述】:我有一个需要线程关联的第三方API。我在我的服务应用程序中使用WCF来处理来自客户端的请求,然后将这些请求... 查看详情

OpenMP:如何在任务中实现线程本地对象?

】OpenMP:如何在任务中实现线程本地对象?【英文标题】:OpenMP:howtorealizethreadlocalobjectintask?【发布时间】:2020-07-3008:49:00【问题描述】:我要做的是并行迭代容器的所有元素,类似于#pragmaompfor;但是,有问题的容器不提供随机访... 查看详情

如何在 PostgreSQL 中实现多对多关系?

】如何在PostgreSQL中实现多对多关系?【英文标题】:Howtoimplementamany-to-manyrelationshipinPostgreSQL?【发布时间】:2012-04-0502:14:21【问题描述】:我相信标题是不言自明的。如何在PostgreSQL中创建表结构以建立多对多关系。我的例子:Pro... 查看详情

在 C++ 中实现 C++ 线程库

】在C++中实现C++线程库【英文标题】:ImplementingaC++threadingLibraryinc++【发布时间】:2009-02-1106:29:26【问题描述】:我是一名java程序员,但目前正在使用c++语言。与java不同,c++没有定义任何线程实用程序。在C++中实现多线程应用程... 查看详情

如何在java中实现跨线程的通讯

一般而言,如果没有干预的话,线程在启动之后会一直运行到结束,但有时候我们又需要很多线程来共同完成一个任务,这就牵扯到线程间的通讯。如何让两个线程先后执行?Thread.join方法privatestaticvoiddemo2(){ThreadA=newThread(newRunnab... 查看详情

如何在angular js中实现多路由

】如何在angularjs中实现多路由【英文标题】:Howtoachievemultipleroutinginangularjs【发布时间】:2018-11-2223:10:07【问题描述】:我在AngularJS中练习routing。到目前为止,我已经研究了2页路由,但现在我想实现3页路由。(function()\'usestrict\';... 查看详情

如何在Java中实现多个线程来下载单个表数据?

】如何在Java中实现多个线程来下载单个表数据?【英文标题】:HowtoimplementseveralthreadsinJavafordownloadingasingletabledata?【发布时间】:2012-01-0916:15:07【问题描述】:如何实现多个线程的多个/相同连接,以便快速下载单个大表数据。... 查看详情

如何在Java中实现多个线程来下载单个表数据?

】如何在Java中实现多个线程来下载单个表数据?【英文标题】:HowtoimplementseveralthreadsinJavafordownloadingasingletabledata?【发布时间】:2012-01-0916:15:07【问题描述】:如何实现多个线程的多个/相同连接,以便快速下载单个大表数据。... 查看详情

java示例代码_多捕获是如何在Java 7中实现的

java示例代码_多捕获是如何在Java 7中实现的 查看详情

如何在 C 中实现我自己的基本 unix shell?

...【发布时间】:2010-12-0218:27:08【问题描述】:我是进程和线程管理的新手。我的Shell应该理解PATH环境变量。可以设置和修改。它以两种方式运行-交互式和批处理模式。Shell能够胜任一项以上的工作,例如ls;ps;wcfile;cal。我也想弄... 查看详情