2.4 设计多线程的程序

news2024/11/25 4:42:48

并行编程

        在现代多核平台上Pthreads十分适用于并行编程,任何需要并行编程的应用领域,都可以用Pthreads进行编程生成相关应用。

        设计并行应用程序时需要考虑到多个方面,如下所示:

  • 并行编程模型
  • 问题分解
  • 负载均衡
  • 通信
  • 数据依赖
  • 同步/竞争条件
  • 内存
  • I/O
  • 程序复杂度
  • 程序功能/性能/耗时

        讨论这些内容已经超出了本教程的范围,感兴趣的读者可以阅读 Introduction to Parallel Computing获得快速概览。

        总的来说,如果想要最大化发挥Pthreads的能力,程序需要能够分解为分离、可独立运行的子任务。如果两个任务在时间轴上是可交换的,互相交错的,那么它们可以用各自的线程来执行,如下图所示。

        具备如下特性的程序有可能适合使用Pthreads编程:

  • 可能因为长时间的I/O操作而阻塞
  • 在某个运行阶段会使用比较多的计算资源
  • 必须处理一些异步事件
  • 一些任务比其他任务更加重要(优先级打断)

        目前已经存在了一些多线程编程模型,如下所示:

  • 管理者/工作者(manager/worker):一个管理线程负责分配工作给其他工作线程,管理线程一般会处理所有输入并把相关工作打包给工作线程。至少有两类相关的常见模型:静态工作线程池和动态工作线程池
  • 流水线(pipeline):一个任务被分解为多个子操作,每个子操作被单独的线程执行,汽车流水线的生产模式和其十分相像。
  • 大众模式(Peer):和管理者/工作者模式很像,只不过当主线程创建了子线程之后,主线程也会参与执行一些具体任务。

共享内存模型

        所有的线程可以访问全局共享内存,同时它们也有自己的私有数据。编程人员需要管理对全局共享数据的访问和同步,如下图所示。

线程安全

        线程安全,简单的说就是一个应用需要能够在不对共享数据产生误操作,或者产生竞争状态的情况下同时执行多个线程任务。

        举个栗子,假如你的应用程序创建了几个线程,它们会调用相同的三方库操作:

  • 三方库操作中会对某个内存中的数据做访问/修改操作
  • 由于多个线程同时调用该操作,可能会出现它们同时尝试修改某一处内存中数据的情况,导致数据不符合预期产生异常
  • 此时如果没有一些同步机制来防止数据被异常操作的情况,我们称它不符合线程安全的要求

        对于编程人员来说,使用第三方库的影响在于如果你无法100%确定某个操作是线程安全的,那么有可能会带来相关的问题。

        所以如果在应用中使用了不确定是否为线程安全的第三方库操作,最好在假设它们不符合线程安全的情况下使用,譬如尽量进行串行调用而非多线程调用。

线程限制

        虽然Pthreads API是ANSI/IEEE制定的标准,但在不同平台的具体实现是多样的。因此在一个平台上可以正常运行的程序,在其他平台上有可能会出错。譬如允许的线程最大数量,和线程的默认堆栈大小,这两个重要信息可能在不同平台上有差异,而它们又是设计程序中需要特别注意的信息。

        后续教程中会继续讨论相关的信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1089956.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python —— 特殊场景处理(鼠标、键盘操作文件上传)

1、鼠标操作 1、概述 使用Selenium的ActionChains类来模拟鼠标操作,导入模块如下: # 导入模块 from selenium.webdriver.common.action_chains import ActionChains 通过ActionChains对象可以发起鼠标左键、右键、移动鼠标等操作,最后使用…

保姆级手把手记录Android studio BottomNavigationView +FrameLayout暴力切换Fragment

开发环境: 效果图: 《《《代码在底部》》》 1,新建项目 2,新建若干Fragment,内容一样,改一下显示出来的Text,名字分别为test1Fragment,test2Fragment,test3Fragment,默认TextView的Text属性分别…

自定义数据训练的rknn模型部署 踩坑记录

自己训练了一个只有2种类别的yolov8模型之后,部署到瑞芯微RKNN。 踩坑一:类别的变化 之前用COCO数据集训练的.pt模型转rknn后,output0的shape为8400 x 176. 而把自定义数据集训练的模型转rknn后,output0的shape为8400 x 98. 为什…

法大大举办2023年伙伴大会:AI赋能,建设生态2.0

“数智‘签’引,聚力共赢——法大大2023年伙伴大会”10月13日在深圳隆重举办。包括腾讯、德勤、PWC、安永、金蝶、致远互联、明源云、蓝凌、玄武、甄零科技、北森、司享网络、明道云、企企通等在内的100多家企业服务厂商及企业高层代表齐聚一堂,探讨AI浪…

探索UI设计|栅格系统的深入分析和应用

界面排版太乱了。你知道网格系统的用途吗?网格系统困扰着许多初级网页设计师,就像一个谜。如果您对网格在设计中的应用有任何疑问,本文是为您量身定制的,并深入分析UI设计中网格系统的基本要素和优点。 什么是网格系统 网格系统…

制造企业有了ERP,是否需要MES系统?

导 读 ( 文/ 1656 ) 在制造业的数字化转型中,企业常常会引入企业资源计划(ERP)系统来实现企业级的信息管理和资源规划。然而,对于制造企业而言,是否还需要引入制造执行系统(MES)系统呢&#xf…

【c++源码】老飞飞源码完整v15源码(包含数据库前端后端源文件)

老飞飞源码完整v15源码(包含数据库前端后端源文件)程序来源于国外网站。程序仅供参考学习游戏开发流程。以及框架内容。 测试环境搭建 Visual Studio 2013 SQL Server 2008r Windows 10 和 11 专业版 这些文件已经过测试,搭建,运行…

介绍一款小巧的Excel比对工具-DiffExcel

【缘起:此前找了一通,没有找到免费又好用的Excel比对工具,而ExcelBDD需要把Excel文件存放到Git,因此迫切需要Excel比对工具。 最新升级到V1.3.3,因为git diff有变化,原来是git diff会修改文件名&#xff0…

数字化转型背景下,MES管理系统的新特征是什么

近年来,随着智能制造的快速发展,MES管理系统作为生产过程中的重要管理系统,也越来越受到企业的关注和应用。在实现MES系统的过程中,需要将JIT思想融入其中,实现业务流程管理的自动化;同时,也需要…

c语言练习86:移除元素

移除元素 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额…

EtherCAT转Modbus-TCP协议网关与DCS连接的配置方法

远创智控YC-ECTM-TCP,自主研发的通讯网关,将为你解决以太网通讯难题。YC-ECTM-TCP是一款EtherCAT主站功能的通讯网关,能够将EtherCAT网络和Modbus-TCP网络连接起来。它可以作为EtherCAT网络中的主站使用,同时也可以作为Modbus-TCP…

Django Test

Django--Laboratory drug management and early warning system-CSDN博客 创建项目doinglms django-admin startproject doinglms python manage.py runserver 运行开发服务器(Development Server) 创建一个自定义 App,名称为 lms: python manage.py startapp lms

HJ86 求最大连续bit数

目录 一、题目 二、代码 一、题目 求最大连续bit数_牛客题霸_牛客网 二、代码 #include <iostream> #include<stack> #include<vector> using namespace std; void TEN_to_TWO(int x, vector<int>& data) { //10进制转换成二进制stack<int&…

androidx.appcompat.widget.Toolbar最右边设置控件不能仅靠最右边

androidx.appcompat.widget.Toolbar最右边设置控件不能仅靠最右边 Android Toolbar左、中、右对齐-CSDN博客&#xfeff;&#xfeff;Android Toolbar左、中、右对齐默认的Android Toolbar中添加子元素view是从左到右依次添加。需要注意的是&#xff0c;Android Toolbar为自身的…

与HTTP相关的各种概念

网络世界 网络世界中最重要的一个名词就是互联网&#xff08;Internet&#xff09;,它以TCP/IP协议族为基础&#xff0c;构建成了一望无际的信息传输网络。而我们通常所说的“上网”&#xff0c;主要就是访问互联网的一个子集——万维网&#xff08;World Wide Web&#xff09…

虹科方案 | 车载以太网转换器交换机解决方案

全文导读&#xff1a;虹科推出的基于转换器&交换机的车载以太网解决方案&#xff0c;旨在满足汽车领域对高速、可靠、安全的数据传输和系统集成的需求&#xff0c;并且具有高稳定性&#xff0c;在转换过程中不修改任何数据包&#xff0c;有效应用于传感器数据采集、台架测试…

【机器学习】sklearn特征选择(feature selection)

文章目录 特征工程过滤法&#xff08;Filter&#xff09;方差过滤相关性过滤卡方过滤F验表互信息法小结 嵌入法&#xff08;Embedded&#xff09;包装法&#xff08;Wrapper&#xff09; 特征工程 特征提取(feature extraction)特征创造(feature creation)特征选择(feature se…

C++入门篇---(2)函数重载

1.函数重载的概念 函数重载&#xff1a; 是函数的一种特殊情况&#xff0c;C允许在同一作用域中声明几个功能类似的同名…

[Vue]之Jwt的入门和Jwt工具类的使用及Jwt集成spa项目

一&#xff0c;jwt入门 1.1 是什么&#xff1f; JWT&#xff0c;全称为 JSON Web Token&#xff0c;是一种用于在网络应用之间传递信息的标准方法。它是基于 JSON 格式定义的一种简洁且自包含的方式&#xff0c;可以安全地在用户和服务之间传输声明信息 1.2 为什么要使用 ①简…

动态分区分配算法之首次适应算法,最佳适应算法,最坏适应算法以及邻近适应算法

1.首次适应算法(First Fit) 1.算法思想: 每次都从低地址开始查找&#xff0c;找到第一个能满足大小的空闲分区。 2.如何实现: 空闲分区以地址递增的次序排列。 每次分配内存时顺序查找空闲分区链&#xff08;或空闲分区表&#xff09;&#xff0c;找到大小能满足要求的第一…