多线程如何在 C 中实现?

2023-10-26

多线程(英语: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 的行为方式非常相似。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多线程如何在 C 中实现? 的相关文章

  • 尝试从c++ linux执行命令行代码

    我尝试了以下代码 从 C 代码与命令行进行通信 include
  • Unix域SOCK_DGRAM和SOCK_SEQPACKET之间的区别?

    根据 Unix 套接字的 Linux 手册页 UNIX 域中的有效套接字类型是 SOCK DGRAM 对于保留消息边界的面向数据报的套接字 与大多数 UNIX 实现一样 UNIX 域数据报套接字始终可靠且不可靠 不重新排序数据报 以及 自
  • Linux 内核:为什么调用 kstrtol 会崩溃?

    我正在学习内核编程 并且对 kstrtol 进行了简单的调用 我用它来将字符串转换为数字 然而 每次我编译这个模块并使用 insmod 将其放入内核时 我都会收到 BUG 无法处理 f862b026 处的内核分页请求 然后是寄存器和堆栈转储
  • 获取进程段的开始和结束 C/C++

    我需要获取以下进程段的开始和结束地址 代码 数据 堆栈 环境 我了解它如何位于内存中 但不知道如何使用 api 调用或其他方式获取它 我找到了如何使用此代码开始某些片段 include
  • 如何在客户端-服务器模型(OpenCV C++)中通过套接字传输 cv::VideoCapture 帧?

    我通过套接字翻译视频 我在另一端看到视频流 但无法接收视频 我的视频文件是空的 我认为问题可能是接收端转换视频格式错误 我应该如何在服务器端对视频进行编码以及如何在客户端对视频进行解码 我使用 Linux Ubuntu Mate OpenC
  • 内联汇编 - cdecl 和准备堆栈

    我最近一直在尝试通过使用缓冲区和不同汇编运算符的原始十六进制等效项来实现 C 中的动态函数 为了说明一个简单的跳转 byte buffer new buffer 5 buffer 0xE9 Hex for jump uint buffer
  • 撤消 chown 和 chmod [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我是 Ubuntu 新手 我运行以下命令将文件保存在 htdocs 文件夹中 以便方便地使用 XAMPP 进行编程 但不了解其安全后果 s
  • USR1 信号后可靠地终止睡眠进程

    我正在编写一个 shell 脚本 它定期执行任务并从另一个进程接收 USR1 信号 该脚本的结构类似于这个答案 https stackoverflow com a 27694965 1402511 bin bash trap echo do
  • I2C 驱动程序应如何在 ACPI 中与 HID PRP0001 匹配

    我正在尝试实例化这个传感器 https elixir bootlin com linux v5 2 source drivers iio proximity vl53l0x i2c c在 ACPI 中使用设备特定数据 即Name DSD 并
  • msgget() 和 mq_open 之间的区别

    我阅读了有关消息队列操作的信息 例如 msgget msgsnd 和 msgrcv 但是当我在堆栈溢出上搜索消息队列相关问题时 我发现还有另一组消息队列操作 例如 mq open mq send mq receive 谁能告诉我这两种类型的
  • Linux 消息队列 - 多个接收者

    我最近一直在研究和研究 Linux 消息队列 并遇到了一些我不太明白为什么会发生的事情 如果我们运行两个程序 它们都在无限 for 循环中使用 msgrcv 来检查消息 然后发送两条消息 那么第一个运行的程序将收到第一条消息 第二个程序将收
  • Vagrant、共享文件夹:利用 inotify 而非 NFS

    我们的 Symfony2 Web 应用程序在开发模式下使用 Assetic 观察器来动态重新编译资产 Web 应用程序在 Docker 容器中运行 该容器在 Vagrant VM Ubuntu 12 04 Precise 中运行 主机是 O
  • 如何在Linux内核中启用CONFIG_PREEMPT选项?

    我是 Linux 内核编程的新手 尝试在 x86 64 上使用旧内核 Linux 2 6 32 我想启用其中的 CONFIG PREEMPT 选项 但找不到有关如何执行此操作的信息 我可以使用我的首选选项编译新内核 但不知道在这种情况下我需
  • pctl(PR_SET_PDEATHSIG) 竞争条件

    据我了解 当父进程死亡时终止子进程的最佳方法是通过prctl PR SET PDEATHSIG 至少在 Linux 上 父进程退出后如何让子进程终止 https stackoverflow com questions 284325 how
  • 如何将回车符作为字符添加到文件中?

    我想要一个像这样的字符串 blablbabla
  • 更改grep命令的分隔符

    我在用grep检测 a href xxxx something here a 当链接在输入中分成两行时 这不起作用 我想 grep 检查直到它检测到但现在它只是将输入输入到 grep 中 直到检测到新行为止 所以如果输入是这样的 a hre
  • 如何从 Linux 和 Solaris 上的挂载中提取 NFS 信息?

    我需要使用提取 NFS 挂载信息mount在 Linux RHEL 4 5 和 Solaris Solaris 10 系统上 由于这是 SSH 命令的一部分 因此提取需要在一行中进行 不幸的是 Linux 和 Solaris 在该行的不同部
  • 服务器启动时 Java 运行时环境 SIGSEGV 错误

    我正在使用 java 版本 1 7 0 45 和 eclipse kepler 在服务器启动时我收到以下错误日志 虽然我发现了几个帖子 1 https stackoverflow com questions 19332489 how to
  • 在 Sublime Text 3 中,我可以将 do 文件的选择发送到 Stata 吗?

    This SO question https stackoverflow com questions 18361667 is there a command line editor that highlights the stata syn
  • 反馈两个进程的stdin和stdout

    我有两个进程通过标准输入和标准输出相互连接 假设我有进程 A 和进程 B B 的标准输出需要输入到 A 的标准输入中 A 的标准输出需要输入到进程 B 的标准输出中 是否有一种简单的方法可以用简单的命令来表达这种关系 或者是否有一个基本的

随机推荐

  • windows“找不到msvcp120.dll ”或“msvcp120.dll 缺失

    系统提示 找不到msvcp120 dll 或 msvcp120 dll 缺失 者 msvcp120 dll 错误 msvcp120 dll是vs2012编译的程序默认的库文件 msvcp120 dll可以解决某些大型游戏 程序由于vs201
  • 超高频RFID服装供应链管理系统

    1 行业概述 传统观念中 服装行业属于低技术含量的劳动密集型产业 但实际上 整个行业的发展与科学技术的高度密不可分 从服装面料的制作到服装设计 生产制作 物流到终端销售 任何一个环节都少不了科技力量的支撑 特别是在供应链管理中 面临着库存信
  • IE和火狐的css兼容性问题

    CSS对浏览器器的兼容性具有很高的价值 通常情况下IE和Firefox存在很大的解析差异 这里介绍一下兼容要点 1 DOCTYPE 影响 CSS 处理 2 FF div 设置 margin left margin right 为 auto
  • dedecms普通文章栏目改成自定义内容模型办法

    在织梦后台 程序 SQl命令工具 INSERT INTO addon18 aid typeid redirecturl userip body SELECT aid typeid redirecturl userip body FROM a
  • pandas 小技巧——读取无表头的csv/xlsx文件&加上指定表头

    在读取csv xlsx文件的时候 有的文件可能没有表头 或者想更换表头 可以用pandas实现 1 excel文件格式示例 无表头 import pandas as pd df pd read excel D dataset raw dat
  • 4个实用的自媒体平台,帮助大家进行热点追踪,打造爆款作品

    大家都知道 作为一个自媒体人 时常需要追热点 根据热点进行创作 那么 热点到底应该怎么找呢 今天给大家介绍4个很实用的热点类自媒体平台 帮助大家进行热点追踪 打造爆款作品 01 腾讯新闻 这个平台就不需要过多介绍了 各种各样的热点都能在这里
  • pycharm安装pandas失败了

    因为期末作业涉及到朴素贝叶斯 聚类等数据分析 就安装了numpy sklearn之类的库 但是我的setting一直用不了 会像上图一样报错 改变pip文件夹的位置也不行 昨天晚上就想一定要解决这个问题 在网站上找了多种方法都不行 升级pi
  • python+selenium抓取网页新闻列表元素,保存到excel文档中

    python selenium 抓取网页新闻列表元素 并记录标题和链接地址 保存到excel文档中 usr local bin python3 python3 9 coding UTF 8 File xwzx1 py Time 2021 0
  • 【QT学习】如何将一个QT的pro工程(qmake编译)移植变成一个cmake编译的工程

    1 背景 之前使用qt自带的编译方式 qmake的方式 编写运行qt程序 但是最近要跟ros框架的其他程序进行通讯要使用ros topic订阅发布 必须用msg 有些msg不能简单的使用std标准消息需要自己定义 但是qmake的方式不支持
  • Python 元组(Tuple)操作详解

    一 创建元组 代码如下 tup1 physics chemistry 1997 2000 tup2 1 2 3 4 5 tup3 a b c d 创建空元组 代码如下 tup1 元组中只包含一个元素时 需要在元素后面添加逗号来消除歧义 代码
  • 启动vmware虚拟机报错

    找到此系统的安装目录中后缀为 lck的文件或目录 将其删除或更改后缀就可以启动了
  • 第七周7.1数组运算课堂学习记录 求素数的方法改进/优化集锦《程序设计入门——C语言》第七期 浙江大学 翁恺

    求素数基本方法及优化 1 基本方法求素数 从2到x 1测试是否可以整除 对于n来说要走n 1遍 n很大时相当于 n 遍 include
  • GGally与pairs相关关系图_史上最全(一)

    作者 李誉辉 四川大学在读研究生 简介对于多个变量之间的相关关系 常常使用相关关系图来可视化 R自带有pairs 函数 可以画相关关系图 但是比较复杂 我们先介绍基于ggplot2的GGally包 等介绍完 再介绍pairs 函数 1 gg
  • 对部门的建议和期待怎么写_个人、项目、部门工作总结怎么写?给你三个模板...

    点击 免费订阅 商务合作QQ 493509007 工作中我们每周 每月 每年都要做总结 那么怎样才能做好总结呢 给大家三个模板 分别为个人工作 年 月 总结 项目 周 月 年 总结 部门 月 年 总结 一 个人 年 月 总结 1 计划的完成
  • 欢迎加入Java私活外包QQ群

    hi 最近有个两个Java项目需要找兼职程序员合作 要求至少会下面一项技术 1 JSP Servlet JDBC Tomcat 2 MongoDB 3 MySQL 4 Docker 5 Redis 6 Vertx 7 测试技术 压力测试 安
  • Protobuf C++ 版入门Demo

    Protobuf C 版入门Demo 前言 有关其编译和安装请查看 Protobuf C 版编译安装和简单使用 之前已经进行了编译安装 并且成功将已知的proto文件转化为cc和h 本文简单探讨如何使用Protobuf进行数据写入和读取 也
  • 使用three.js在Vue中创建3D图

    使用three js创建3D图 1 电梯 注意 只为自己做笔记用的 全部是收藏的博客地址当电梯用 1 电梯 1 展示 https wow techbrood com fiddle 34388 闪光球 https blog csdn net
  • 字典树(介绍+实现+例题)

    字典树 介绍 字典树也叫前缀树 Trie树等 字典树是一颗非典型的多叉树模型 字典树的结点包含有一个长度为26的指针数组 分别对应26个字母 指向当前字母对应的下一个字母 字典树充分利用了字符串的公共前缀 包含三个单词 sea sells
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • 多线程如何在 C 中实现?

    多线程 英语 multithreading 是指从软件或者硬件上实现多个线程并发执行的技术 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程 进而提升整体处理性能 具有这种能力的系统包括对称多处理机 多核心处理器以及芯片级