手机网站有什么区别吗深圳网站建设公司服务怎么做

web/2025/9/29 14:40:30/文章来源:
手机网站有什么区别吗,深圳网站建设公司服务怎么做,设计网页报价,石家庄经济join detachjoin和detach为最基本的用法#xff0c;join可以使主线程#xff08;main函数#xff09;等待子线程#xff08;自定义的function_1函数#xff09;完成后再退出程序#xff0c;而detach可以使子线程与主线程毫无关联的独立运行#xff0c;当主线程执行…join detachjoin和detach为最基本的用法join可以使主线程main函数等待子线程自定义的function_1函数完成后再退出程序而detach可以使子线程与主线程毫无关联的独立运行当主线程执行完毕后直接退出程序不管子线程是否执行完毕。#includeiostream #includethread using namespace std;// 子线程函数 void function_1() {for(int i10;i0;i--) // 循环10次输出cout Hello endl; }int main() {thread t1(function_1);//线程开始//t1.join();//方式1结合等待其完成t1.detach();//方式2分离使其自行运行cout未来得及输出完毕主线程已结束cout ~~~~~~~~~~~World~~~~~~~~~~~ endl;if (t1.joinable()){t1.join();}return 0; } detach方法的执行结果如下可以看出子线程没来得及执行完毕。Hello ~~~~~~~~~~~World~~~~~~~~~~~ 请按任意键继续. . .如果换成join方法则可以输出10条Hello语句。Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello ~~~~~~~~~~~World~~~~~~~~~~~ 请按任意键继续. . .try-catch异常捕获机制的使用join可以使某些比较重要的函数执行完毕后再退出但当程序出现异常时程序仍会直接退出join没有起到应有的作用这是可以通过try-catch异常捕获机制结合join方法使某些函数子线程在程序出现异常时也能先执行完毕再退出例子如下通过OpenCV读取显示一张不存在的图片产生异常。#includeiostream #includethread #includeopencv2/opencv.hpp// 子线程函数假定该函数比较重要无论如何都要执行完毕再退出程序 void function_1() {for (int i 0; i 100; i){std::cout Hello i std::endl;} }int main() {std::thread t1(function_1);//t1线程开始运行try //【捕获异常的范围】{cv::Mat img cv::imread(1.jpg);//读取一张不存在的图片使下句的图片显示出现异常cv::imshow(, img);//此处将出现异常?错误?//出现异常会导致整个程序直接退出//捕获异常后可以进行补救如使t1子线程执行完毕。}catch (...)//捕获所有异常{std::cout catch............... std::endl;t1.join();//使子线程执行完毕throw;}t1.join();std::cout 主程序正常退出 std::endl;return 0; } 可以看出运行后产生了一个OpenCV Error没能输出主程序正常退出 但子线程在程序出现异常后依然可以继续执行完毕。HelloOpenCV Error: Assertion failed (size.width0 size.height0) in cv::imshow, file D:Tools1opencvopencvsourcesmoduleshighguisrcwindow.cpp, line 325 0 Hello1catch...............Hello2 Hello3 Hello4 Hello5 此处省略... Hello98 Hello99通过类构造子线程 ref方法传参C开发中更常使用类作为子线程函数而不是单独的某个函数。注意一点在线程按引用传递参数时的写法需要使用std::ref方法。#includeiostream #includethread #includestringclass Fctor { public:void operator()(std::string msg)//按【引用】传递参数{std::cout from t1: msg std::endl; msg Hello;//修改传入的参数用于后面的主线程输出} };int main() {std::string s -----------World-----------;//待传入的参数用于子线程输出// 方式1a这种方式会自动复制一份参数传进去//Fctor fct;//std::thread t1(fct,s);//t1线程开始运行// 方式1b这种方式会自动复制一份参数传进去//std::thread t1((Fctor()), s);//t1线程开始运行// 方式2a按引用传递Fctor fct;std::thread t1(fct, std::ref(s));//t1线程开始运行// 方式2b按引用传递//std::thread t1((Fctor()), std::ref(s));t1.join();std::cout from main: s std::endl;return 0; } 运行结果方式1a或1bfrom t1:-----------World----------- from main:-----------World----------- 请按任意键继续. . .方式2a或2b:from t1:-----------World----------- from main:Hello 请按任意键继续. . .mov方法传参 线程对象移动除了使用ref方法对子线程进行传参还可以使用mov方法传参此外mov还可以移动线程对象。#includeiostream #includethread #includestringclass Fctor { public:void operator()(std::string msg)//按引用传递参数{std::cout from t1: msg std::endl;msg Hello;} };int main() {std::string s ----------------World---------------;std::cout Main_thread_ID: std::this_thread::get_id() std::endl;//主线程IDstd::thread t1((Fctor()), std::move(s));//子线程1(将字符串从主线程移动到子线程)std::cout Sub_thread1_ID t1.get_id() std::endl;//线程对象只能被移动不能被复制。std::thread t2 std::move(t1);//子线程2接管子线程1此时子线程1为空std::cout Sub_thread2_ID t2.get_id() std::endl;//可以看到两个子线程的ID是相同的t2.join();//等待子线程2结束//检测硬件并发特性(此句只是用来显示计算机支持的并发线程数量)std::cout std::thread::hardware_concurrency() std::endl;return 0; } 运行结果如下可以看出传参无误并且两个子线程的ID相同说明子线程对象移动成功。Main_thread_ID:36576 from t1:Sub_thread1_ID37472----------------World---------------Sub_thread2_ID37472 8 请按任意键继续. . .mutex lock_guardmutex即互斥量可理解为一把锁访问某些资源时先加锁访问后解锁。 另一进程访问同一资源时首先尝试加锁如果锁处于未释放状态则无法加锁需等待其它线程对锁的释放。#includeiostream #includethread #includestring #includemutexstd::mutex mu;//【互斥对象】》一把锁通过函数调用cout并为cout加锁防止同时访问cout void share_print(std::string msg, int id) {mu.lock();std::cout msg id std::endl;mu.unlock(); }//子线程函数 void function_1() {for(int i 0; i 100; i)share_print(from t1: ,i ); }int main()//主线程 {std::thread t1(function_1);//t1线程开始运行for (int i 0; i 100; i){share_print(from main:, i);}t1.join();//等待子线程结束return 0; } 运行结果类似如下from t1:0 from main:0 from t1:1 from main:1 from t1:2 from t1:3 from t1:4 from t1:5 省略...如果未使用加锁机制两线程会互相争抢cout的使用权从而导致输出混乱注释掉mu.lock()与mu.unlock()后的输出结果如下from t1:0from main:0from t1:1from main:1from t1:2from main:2from t1:3 from main:3from t1:4from t1:5from main:4 省略...由于lock()与unlock()必须成对出现为方便管理出现了lock_guard它可以对mutex进行管理自动实现lock()与unlock()原理是在其构造与析构中自动调用。另外还可有附加参数。修改上面的share_print为如下可实现同样的效果。void share_print(std::string msg, int id) {std::lock_guardstd::mutex guard(mu);std::cout msg id std::endl; } 下面的代码是将share_print封装到一个类中并添加将输出信息同时保存到文件中的功能#includeiostream #includethread #includestring #includemutex #includefstreamclass LofFile { public:LofFile(){ f.open(log.txt); }~LofFile(){ f.close(); }void shared_print(std::string id, int value){std::lock_guardstd::mutex locker(m_mutex);f from id : value std::endl;//写入文件std::cout from id : value std::endl;//输出}private://受保护的成员std::mutex m_mutex;//锁std::ofstream f;//此时f完全在锁的保护下 };void function_1(LofFile log) {for (int i 0; i -100; i--)log.shared_print(t1, i); }int main()//主线程 {LofFile log;std::thread t1(function_1,std::ref(log));//t1线程开始运行for (int i 0; i 100; i){log.shared_print(main, i);}t1.join();return 0; } 死锁 adopt_lock当某个资源被两把以上的锁嵌套加锁且锁的顺序不一致时可能发生死锁。原因在于多个线程可能各自加了1把锁后同时在等待对方释放剩余的锁。最简单的解决方法是只要锁的顺序一致就不会死锁。#includeiostream #includethread #includestring #includemutex #includefstreamclass LogFile {std::mutex m_mutex;//锁1std::mutex m_mutex2;//锁2std::ofstream f; public:LogFile()//构造函数初始化时新建一个txt文件{f.open(log.txt);}void shared_print(std::string id, int value){std::lock_guardstd::mutex locker(m_mutex);//锁住m_mutex成员std::lock_guardstd::mutex locker2(m_mutex2);std::cout id : value std::endl;}void shared_print2(std::string id, int value){std::lock_guardstd::mutex locker2(m_mutex2);//【出现死所交换和下一行的位置即可】std::lock_guardstd::mutex locker(m_mutex);//std::lock_guardstd::mutex locker2(m_mutex2);std::cout id : value std::endl;} };void function_1(LogFile log) {for (int i 0; i -1000; i--)log.shared_print(std::string(from t1:), i); }int main()//主线程 {LogFile log;std::thread t1(function_1, std::ref(log));//t1线程开始运行for (int i 0; i 1000; i){log.shared_print2(std::string(from main:), i);}t1.join();return 0; } 某次运行结果如下程序运行到某时刻卡住了:from main::0 from main::1 省略... from main::154 from main::155 from main::156 from main::157 from t1::0当程序比较复杂时手动方法管理加锁顺序可能相当麻烦这是就出现了adopt_lock参数来解决。locklock_guard的adopt_lock参数自动避免死锁问题。lock()可同时管理多个锁顺序无影响同时锁住多个锁若不可先释放然后继续尝试。 lock_guard()的adopt_lock参数即抛弃lock操作因为前面必须已加锁只使用其自动unlock功能。#includeiostream #includethread #includestring #includemutex #includefstreamclass LogFile {std::mutex m_mutex;//锁1std::mutex m_mutex2;//锁2std::ofstream f; public:LogFile(){f.open(log.txt);}void shared_print(std::string id, int value){std::lock(m_mutex, m_mutex2);//lock()同时管理多个锁std::lock_guardstd::mutex locker(m_mutex,std::adopt_lock);//adopt_lock即抛弃lock操作因为上句已加锁std::lock_guardstd::mutex locker2(m_mutex2, std::adopt_lock);//在析构时自动unlock()std::cout id : value std::endl;}void shared_print2(std::string id, int value){std::lock(m_mutex, m_mutex2);std::lock_guardstd::mutex locker2(m_mutex2, std::adopt_lock);std::lock_guardstd::mutex locker(m_mutex, std::adopt_lock);std::cout id : value std::endl;} };void function_1(LogFile log) {for (int i 0; i -1000; i--)log.shared_print(std::string(from t1:), i); }int main()//主线程 {LogFile log;std::thread t1(function_1, std::ref(log));//t1线程开始运行for (int i 0; i 1000; i){log.shared_print2(std::string(from main:), i);}t1.join();return 0; } 运行结果如下不会出现死锁from t1::0 from main::0 from t1::-1 from main::1 省略... from t1::-997 from main::994 from t1::-998 from main::995 from t1::-999 from main::996 from main::997 from main::998 from main::999 请按任意键继续. . .

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

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

相关文章

12数据网站建设西安网站建设价格明细

文章目录 📖 前言1. 通信背景1.1 进程通信的目的:1.2 管道的引入: 2. 匿名管道2.1 匿名管道的原理:2.2 匿名管道的创建:2.3 父子进程通信:2.3.1 read()阻塞等待 2.4 父进程给子进程派发任务:2.5…

找外贸工作哪个网站好网站后台服务

首先先介绍visibility这个CSS属性。 visibility用于表示该元素是否显示,其取值有: visible:设置对象可视。  hidden:设置对象隐藏。  collapse:主要用来隐藏表格的行或列,隐藏的行或列能够被其他内容是…

怎么查网站做站点地图西安千秋网络科技有限公司

以下是nuxt3中useFetch的函数签名,看起来很长有点乱对不对,但这还是我优化格式后的结果,不然更难看(原始的代码是在同一行里显示),泛型参数部分看红色的左右尖括号里的部分(各个泛型参数用红色的…

青岛网站建设与设计制作.net网站搭建

题目 给你字符串 s 和整数 k 。 请返回字符串 s 中长度为 k 的单个子字符串中可能包含的最大元音字母数。 英文中的 元音字母 为(a, e, i, o, u)。 示例 1: 输入:s “abciiidef”, k 3 输出:3 解释:…

网站首页布局设计模板WordPress邮箱注册慢

21、简单说一下说说置信区间、置信度。 ①置信区间是指由样本统计量所构成的总体参数的估计区间。通常以一个样本统计量的估计值为中心,加减一个标准误差的倍数,构成一个区间。 ②置信度是对置信区间的信心程度的度量,通常以百分比的形式表…

衡阳网站优化免费咨询网站优化都是怎么做的

真的非常感谢CnBlogs.com,因为有很多教程里写的知识点并不全面,而且也没附带例子.通过这里我学习到了很多很多.希望网站能越办越好哦.下面是我学习分布式开发时写的一个小demo,当然功能有限,技术也很低.希望大师们能拍拍砖,不吝赐教.呵呵软件运行的一个截图下面说说流程吧,1:利…

网站首页漂浮广告代码建设企业网站体会

在使用Vue.js进行开发时,将软件工程的原则和最佳实践应用到项目中,可以帮助提高项目的质量、维护性和团队的协作效率。以下是一些具体的建议: 1. 项目结构和模块化 合理组织项目结构:按功能或特性将代码组织成模块,使…

门头沟做网站公司网站建设资讯平台

这是头哥侃码的第241篇原创上周末,我读初中的儿子突然问我:“爸爸,你是不是从好买离职了?”我听完,忙惊讶地问他是怎么知道的。他朝我做了个鬼脸,然后指了指我的手机说:“你的文章写的如此生动&…

知名企业网站规划书无锡网站推广哪家公司好

1、简介Redis的五大数据类型也称五大数据对象;前面介绍过6大数据结构,Redis并没有直接使用这些结构来实现键值对数据库,而是使用这些结构构建了一个对象系统redisObject;这个对象系统包含了五大数据对象,字符串对象(st…

上海做原创网站怎么写微信小程序

*本文转载自公众号“Unity官方平台”。本文由视觉效果艺术家Evgeny Starostin分享如何使用Unity制作魔法火焰效果的过程,让我们一起学习和制作魔法火焰吧。下面是魔法火焰效果图。项目下载本文提供项目工程及着色器下载。本文为转载文章,请关注公众号“U…

网站建设的例子品牌网站建设只詢大蝌蚪

TQ210——S5PV210启动过程 1、S5PV210内存地址映射 S5PV210 含有一个大小为64KB的IROM,起始地址为0xD0000000,结束地址为0xD000FFFF;含有一个大小为96KB的 IRAM,起始地址为0xD0020000,结束地址为0xD0037FFF;内存起始地…

宝安中心站是几号线织梦图片网站源码

自定义函数 C语言提供了大量的库函数(右侧资料下载中有),比如stdio.h提供输出函数,但是还是满足不了我们开发中的一些逻辑,所以这个时候需要自己定义函数,自定义函数的一般形式: 注意&#xff1…

什么叫子网站10大免费软件下载

1.数据库的相关介绍 关系型数据库管理系统:(英文简称:RDBMS) 为我们提供了一种存储数据的特定格式,所谓的数据格式就是表, 在数据库中一张表就称为是一种关系. 在关系型数据库中表由两部分组成&#xf…

在线购物商城网站芜湖有没有网站建设公司吗

众所周知,在平台上网约车的时候,要是超出一定时间放鸽子,通常都是要扣除乘客部分钱,反之是司机取消了订单,平台同样会给司机处罚,在路程近的单子上,有些司机是接了后就不想跑,但是也…

网站开发多用什么语言可以免费做网站

来源:新浪科技摘要:虽然目前而言无线电天线仍然是太空通信的支柱,但目前未来发展方向是激光通讯系统。在太空中,没有人会听到你的尖叫——因为声音不会在真空中传播,而且你需要某种类型的无线电波中继携载这些信息&…

网站建设项目申请书简单的公司简介

1、API (1)基于linux做应用开发,其实就是通过调用linux系统提供的API来实现。 (2)API 是一些由linux系统提供的函数,给应用层使用,以完成一定的功能。 (3)常用的文件IO的…

jsp网站部署怎么做地方门户网站建设多少钱

2020年简单的早安共勉句子短信汇编58条爱情,就像两个人在拉猴皮筋,疼的永远是后撒手的那个。早安!以下是小编为大家推荐的早安共勉句子58条,欢迎大家借鉴与参考,希望对大家有所帮助。1、这地球少了谁都照样转,就是少了…

广安公司网站建设重庆建设教育协会网站首页

这一节我们将了解Android OpenMax框架,该框架了解完成之后,我们会再回过头去了解 ACodec,将 MediaCodec - ACodec - OpenMax 连接起来,了解组件的创建控制以及 buffer 的流转。 本篇属于个人学习笔记,如有错误欢迎指出…

上传视频网站开发企业网站管理系统用哪个好

背景:近年来,随着自动化技术的不断进步,Modbus与Profinet之间的转换成为了许多工厂和企业普遍关注的问题。 Modbus转Profinet网关作为两个不同协议设备连接的桥梁,安华变频器作为一种电气设备,能够改变电源的频率和电…