当前位置: 首页 > news >正文

多线程传参以及线程的优缺点

进程是资源分配的基本单位
线程是调度的基本单位  

笼统来说,线程有以下优点:

  • 创建一个新线程的代价要比创建一个新进程小得多
  • 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多
  • 线程占用的资源要比进程少很多
  • 能充分利用多处理器的可并行数量
  • 在等待慢速I/O操作结束的同时,程序可执行其他的计算任务
  • 计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现
  • I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作。

线程的缺点也不少:

性能损失
一个很少被外部事件阻塞的计算密集型线程往往无法与共它线程共享同一个处理器。如果计算密集型 线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的 同步和调度开销,而可用的资源不变。
健壮性降低
编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。
缺乏访问控制
进程是访问控制的基本粒度,在一个线程中调用某些 OS 函数会对整个进程造成影响。
编程难度提高
编写与调试一个多线程程序比单线程程序困难得多

 所谓健壮性,就是鲁棒性,在多线程中,任何一个线程出现崩溃的情况,整个进程都跟着玩完。

而多进程代码就不会,因为进程有独立性。

进程的多个线程共享同一地址空间 , 因此 Text Segment(代码段) Data Segment(数据区) 都是共享的 , 如果定义一个函数 , 在各线程 中都可以调用, 如果定义一个全局变量 , 在各线程中都可以访问到。
除此之外, 各线程还共享以下进程资源和环境 :
  • 文件描述符表
  • 每种信号的处理方式(SIG_ IGNSIG_ DFL或者自定义的信号处理函数)
  • 当前工作目录
  • 用户id和组id
线程共享进程数据,但也拥有自己的一部分数据 :
线程 ID
一组寄存器
errno
信号屏蔽字
调度优先级

每个线程都要有自己的独立的硬件上下文,也要有自己独立的栈结构。

linux没有真线程,只有轻量化进程,所以Linux OS只会提供轻量化进程的系统调用,不会直接提供线程创建的接口。 

操作系统和用户之间有一层软件层,对上提供线程的相关控制接口。

然后在软件层中,将线程对应成LWP。

它并不属于操作系统,而是开发者封装的一个库。叫做 pthread原生线程库。

任何一款Linux系统都有这个库。

 

我们可以对mythread所回调的函数进行传参。

#include<iostream>
#include<string>
#include<pthread.h>
#include<unistd.h>
using namespace std;
void *ThreadRoutine(void*args)
{string stringname=(const char*)args;while(true){cout<<"I am new Thread  "<<"threadname"<<stringname<<endl;sleep(1);}}
int main()
{pthread_t tid;pthread_create(&tid,nullptr,ThreadRoutine,(void*)"thread 1");while(true){cout<<"I am main Thread"<<endl;sleep(1);}
}

 

这个参数传什么都行。 

可以像我一样直接传一个类。

#include<iostream>
#include<string>
#include<functional>
#include<pthread.h>
#include<unistd.h>
#include<time.h>
using namespace std;
using func_t=function<void()>;
class ThreadData
{public:ThreadData(const string&name,const uint64_t&ctime,func_t f):threadname(name),createtime(ctime),func(f){}public:string threadname;uint64_t createtime;func_t func;
};
void *ThreadRoutine(void*args)
{ThreadData*td=static_cast<ThreadData*>(args);while(true){cout<<"I am new Thread  "<<td->threadname<<' '<<td->createtime<<' '<<endl;td->func();sleep(1);}}
void print()
{cout<<"我是线程执行的大任务的一部分"<<endl;
}
int main()
{pthread_t tid;ThreadData*td=new ThreadData("Thread 1",uint64_t(time(nullptr)),print);pthread_create(&tid,nullptr,ThreadRoutine,td);while(true){cout<<"I am main Thread"<<endl;sleep(1);}
}

也可以像下面这样多线程传参。

#include<iostream>
#include<string>
#include<functional>
#include<vector>
#include<pthread.h>
#include<unistd.h>
#include<time.h>
using namespace std;
using func_t=function<void()>;
const int threadnum=5;
class ThreadData
{public:ThreadData(const string&name,const uint64_t&ctime,func_t f):threadname(name),createtime(ctime),func(f){}public:string threadname;uint64_t createtime;func_t func;
};
void *ThreadRoutine(void*args)
{ThreadData*td=static_cast<ThreadData*>(args);while(true){cout<<"I am new Thread  "<<td->threadname<<' '<<td->createtime<<' '<<endl;td->func();sleep(1);}}
void print()
{cout<<"我是线程执行的大任务的一部分"<<endl;
}
int main()
{for(int i=0;i<threadnum;i++){pthread_t tid;char threadname[64];snprintf(threadname,sizeof threadname,"%s-%d","thread",i);ThreadData*td=new ThreadData(threadname,uint64_t(time(nullptr)),print);pthread_create(&tid,nullptr,ThreadRoutine,td);}while(true){cout<<"I am main Thread"<<endl;sleep(1);}
}

 

上面提到多线程代码健壮性低。

 一个线程出错,全都会崩溃。

 

相关文章:

多线程传参以及线程的优缺点

进程是资源分配的基本单位 线程是调度的基本单位 笼统来说&#xff0c;线程有以下优点&#xff1a; 创建一个新线程的代价要比创建一个新进程小得多 与进程之间的切换相比&#xff0c;线程之间的切换需要操作系统做的工作要少很多 线程占用的资源要比进程少很多 能充分利用多…...

keil创建单片机工程

一、创建工程 打开Keil uVision4&#xff0c;依次选择 Project—>New uVision4 Project&#xff0c;选择工程保存路径及填写工程名称&#xff0c;如下图 然后点“保存”。在Select a CPU Data Base File中选择"STC MCU Database"&#xff0c;点 "OK"&am…...

QT 串口助手 学习制作记录

QT 串口助手qt 学习制作记录 参考教程&#xff1a;​​​​​​QT初体验&#xff1a;手把手带你写一个自己的串口助手_qt设计串口助手的流程图-CSDN博客 Qt之串口编程&#xff08;添加QSerialPort模块&#xff09;_如何安装 qt串口模块教程-CSDN博客 串口调试助手&#xff1…...

Github 2024-04-13 Rust开源项目日报Top10

根据Github Trendings的统计,今日(2024-04-13统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10CUE项目1Go项目1Tauri: 构建小型、快速和安全的桌面应用程序 创建周期:1673 天开发语言:Rust协议类型:Apache License 2.0Star数量…...

大模型日报|今日必读的10篇大模型论文

大家好&#xff0c;今日必读的大模型论文来啦&#xff01; 1.谷歌推出新型 Transformer 架构&#xff1a;反馈注意力就是工作记忆 虽然 Transformer 给深度学习带来了革命性的变化&#xff0c;但二次注意复杂性阻碍了其处理无限长输入的能力。 谷歌研究团队提出了一种新型 T…...

深度学习 Lecture 8 决策树

一、决策树模型&#xff08;Decision Tree Model) 椭圆形代表决策节点&#xff08;decison nodes)&#xff0c;矩形节点代表叶节点&#xff08;leaf nodes)&#xff0c;方向上的值代表属性的值&#xff0c; 构建决策树的学习过程&#xff1a; 第一步&#xff1a;决定在根节点…...

打包 docker 容器镜像到另一台电脑

# 提交容器为镜像 <container_id> 容器id my_migration_image 镜像名称 docker commit <container_id> my_migration_image # 保存镜像为tar文件 docker save my_migration_image > my_migration_image.tar 在另一台电脑上导入上面的镜像&#xff0c;请…...

贪心算法--购买股票

给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买&#xff0c;然后在 同一天 出售。 返回 你能获得的 最大 利润 。 示例 1&a…...

在Mac主机上连接Linux虚拟机

前言 最近醉心于研究Linux&#xff0c;于是在PD上安装了一个Debian Linux虚拟机&#xff0c;用来练练手。但是每次在mac和Linux之间切换很是麻烦&#xff0c;有没有一种方法&#xff0c;可以在mac终端直接连接我的虚拟机&#xff0c;这样在mac终端上就可以直接操控我的Linux虚…...

前端如何单独做虚拟奖金池?

公司业务需求要做一个虚拟奖金池&#xff0c;具体是需求是&#xff0c;不需要后端数据支持&#xff0c;但是又需要不同用户看到的奖金池数据每次变动都是一致的&#xff0c;并且要在给定的最小最大值中变动。 一开始看需求&#xff0c;因为需要所有登录/未登录&#xff0c;不同…...

前端md5校验文件

前端获取文件的md5值&#xff0c;与文件一同传到后端&#xff0c;后端同样对md5值进行校验。如果相同&#xff0c;则文件未被损坏&#xff08;其实这种方式优点类似于tcp、ip的差错校验&#xff0c;好像token也是这种方式&#xff09; 项目准备 前端并不可能手写一个算法来实…...

总结SQL相对常用的几个字符函数

目录 字符的截取 substr() trim()、ltrim()、rtrim() 字符串的拼接 ||、 字符的大小写转换 upper(column_name):大写 lower(column_name):小写 字符替换 replace() 搜索字符 instr(column_name, substring_to_find,start,n_appearence) charindex(substring_to_fi…...

云计算笔记

RAID的组合方式 RAID0&#xff1a;多个硬盘同时工作&#xff0c;可提供性能&#xff0c;无冗余机制 RAID1&#xff1a;数据保存多份&#xff0c;提供冗余机制&#xff0c;性能受到影响 RAID3&#xff1a;存在数据盘和单独校验盘&#xff0c;数据写入 至数据盘后需要运算且将…...

网络安全学习路线-超详细

零基础小白&#xff0c;到就业&#xff01;入门到入土的网安学习路线&#xff01; 在各大平台搜的网安学习路线都太粗略了。。。。看不下去了&#xff01; 建议的学习顺序&#xff1a; 一、网络安全学习普法&#xff08;心里有个数&#xff0c;要进去坐几年&#xff01;&#x…...

【多模态检索】Coarse-to-Fine Visual Representation

快手文本视频多模态检索论文 论文&#xff1a;Towards Efficient and Effective Text-to-Video Retrieval with Coarse-to-Fine Visual Representation Learning 链接&#xff1a;https://arxiv.org/abs/2401.00701 摘要 近些年&#xff0c;基于CLIP的text-to-video检索方法…...

VRRP——虚拟路由冗余协议

什么是VRRP 虚拟路由冗余协议VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;是一种用于提高网络可靠性的容错协议。 通过VRRP&#xff0c;可以在主机的下一跳设备出现故障时&#xff0c;及时将业务切换到备份设备&#xff0c;从而保障网络通信的连续性和可…...

隧道应急广播应该如何搭建?

隧道应急广播系统的搭建需遵循以下关键步骤&#xff0c;确保在紧急情况下能够迅速、准确地传达信息&#xff0c;保障人员安全&#xff1a; 1. 需求分析与规划设计&#xff1a; 明确目标&#xff1a;确定广播系统覆盖范围&#xff08;如隧道全长、出入口、避难所等关键位置&…...

OpenHarmony实战开发-Worker子线程中解压文件。

介绍 本示例介绍在Worker 子线程使用ohos.zlib 提供的zlib.decompressfile接口对沙箱目录中的压缩文件进行解压操作&#xff0c;解压成功后将解压路径返回主线程&#xff0c;获取解压文件列表。 效果图预览 使用说明 1.点击解压按钮&#xff0c;解压test.zip文件&#xff0c…...

中国科学院大学学位论文LaTeX模版

Word排版太麻烦了&#xff0c;公式也不好敲&#xff0c;推荐用LaTeX模版&#xff0c;全自动 官方模版下载位置&#xff1a;国科大sep系统 → \rightarrow → 培养指导 → \rightarrow → 论文 → \rightarrow → 论文格式检测 → \rightarrow → 撰写模板下载百度云&#…...

秘塔和Kimi AI在资料查询和学习中的使用对比

一、引言 最近老猿在网上查资料时&#xff0c;基本上都使用Kimi AI进行查询&#xff0c;发现其查询资料后总结到位&#xff0c;知识点的准确度较高。今天早上收到一个消息&#xff0c;说新推出的秘塔AI比Kimi更新进&#xff0c;老猿利用在学习的《统计知识学习》简单对比试用了…...

Pandoc:5步掌握全能文档转换的极简工作流

Pandoc&#xff1a;5步掌握全能文档转换的极简工作流 【免费下载链接】pandoc Universal markup converter 项目地址: https://gitcode.com/gh_mirrors/pa/pandoc 价值定位&#xff1a;为什么每个开发者都需要一款"格式翻译官" 当你需要将Markdown笔记转换为…...

开源电池管理系统:SmartBMS的技术创新与实践应用

开源电池管理系统&#xff1a;SmartBMS的技术创新与实践应用 【免费下载链接】SmartBMS Open source Smart Battery Management System 项目地址: https://gitcode.com/gh_mirrors/smar/SmartBMS SmartBMS是一套开源智能电池管理系统&#xff0c;专为锂离子电池组&#…...

高通平台USB充电背后的秘密:从SBL1阶段到Kernel的电池ID识别全解析

高通平台USB充电与电池ID识别的深度技术解析 在Android设备开发中&#xff0c;电源管理系统的稳定性直接影响用户体验。作为底层驱动工程师&#xff0c;理解高通平台从硬件到软件的完整充电流程至关重要。本文将深入剖析从XBL阶段到Kernel层的电池识别机制&#xff0c;揭示BATT…...

突破运营商限制:中兴光猫配置文件解密工具完全指南

突破运营商限制&#xff1a;中兴光猫配置文件解密工具完全指南 【免费下载链接】ZET-Optical-Network-Terminal-Decoder 项目地址: https://gitcode.com/gh_mirrors/ze/ZET-Optical-Network-Terminal-Decoder 一、用户痛点解析&#xff1a;你是否正遭遇这些网络管理困境…...

告别手动操作!用Word宏/VBA实现doc批量转docx的隐藏技巧

职场效率革命&#xff1a;Word宏/VBA零代码实现文档格式批量升级 每天面对堆积如山的.doc文件&#xff0c;行政文员小张总要手动打开每个文件另存为.docx格式——这个机械操作不仅耗时费力&#xff0c;还容易遗漏文件。其实微软Office内置的自动化工具能完美解决这个问题&#…...

临近起飞,在哪个平台更容易捡漏特价机票?2026年实测指南

“机票越临近起飞越便宜”——这个说法你一定听过。每逢假期临近&#xff0c;总有人在社交媒体上分享自己“起飞前两小时抢到白菜价机票”的神奇经历。但当你真的想在清明、五一出行前“赌一把”时&#xff0c;往往发现价格不仅没降&#xff0c;反而翻倍了。那么问题来了&#…...

收藏!2026非科班/转行小白必看:3步切入AI大模型,月薪30w+实战路径

2026年的职场赛道&#xff0c;AI大模型依旧是绝对的“黄金风口”。 最新行业报告显示&#xff0c;AI相关岗位需求逆势增长37%&#xff0c;薪资领跑全行业&#xff0c;大厂校招起薪普遍突破25k。但一个残酷的现实是&#xff1a; 太多非科班、半路转行的程序员&#xff0c;还在门…...

微信聊天记录永久保存与智能分析:WeChatMsg完全使用指南

微信聊天记录永久保存与智能分析&#xff1a;WeChatMsg完全使用指南 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeC…...

零基础玩转luci-app-unblockneteasemusic完全指南:从安装到多设备协同的3步进阶法

零基础玩转luci-app-unblockneteasemusic完全指南&#xff1a;从安装到多设备协同的3步进阶法 【免费下载链接】luci-app-unblockneteasemusic [OpenWrt] 解除网易云音乐播放限制 项目地址: https://gitcode.com/gh_mirrors/lu/luci-app-unblockneteasemusic luci-app-u…...

绿色低碳+高效交付:中集模块化数据中心用实力印证中国方案全球竞争力

随着人工智能与绿色转型成为全球经济增长核心引擎&#xff0c;高算力需求正推动数据中心建设向预制化、高效能方向加速演进。中集集团&#xff08;000039.SZ/2039.HK&#xff09;凭借工业化制造与全球交付优势&#xff0c;2025年在模块化数据中心&#xff08;AIDC&#xff09;领…...