C++进阶
文章平均质量分 88
很难绷得住
点波关注不迷路
展开
-
C++ 多线程学习12 线程池
注意:用户可能大批量输入任务,若没有使用多线程则一次只能处理一个,效率非常低下,又不想无限制创建线程来处理他们,这可能导致系统崩溃,于是使用线程池一次只能处理16个任务,未处理的任务在任务队列tasks_中排队,(3)输入v时开始视频转码:先用make_shared来创建一个task对象,输入视频源,输出尺寸,保存信息等。(1)输入L时调用线程池的task_run_count(),返回任务计数,任务计数在task run前+1,结束时减1,main()在启动线程后紧跟一个无限循环,与用户在终端上进行交互,.原创 2022-08-05 23:10:04 · 853 阅读 · 0 评论 -
c++多线程学习11 packaged_task与async
调用之后,两个对象共享相同的共享状态(1).stdpackaged_task对象是异步提供程序(asynchronousprovider),应通过调用存储的任务(storedtask)在某个时刻将共享状态设置为就绪。等待结果返回,wait_for可设置超时时间,如果在超时时间之内任务完成,则返回stdfuture_statusready状态;packaged_task类的主要作用是把一个函数包装成一个对象,通过这个对象的访问的时候在函数的调用和返回值的获取可以拆分成两步。...............原创 2022-07-31 19:19:19 · 881 阅读 · 0 评论 -
C++多线程学习10 promise和future多线程异步传值
先创建一个测试线程对主线程的承诺p,再从p中获得future对象,用这个对象做为信物来接收承诺P产生的值,在创建线程的时候将这个承诺传过去,然后主线程想要获得信物的值,在测试线程对承诺设置值之前主线程将在get那等待,设置好值后将返回这个值:...原创 2022-07-30 21:56:12 · 454 阅读 · 0 评论 -
C++多线程学习09 条件变量
使用lamda表达式当收到信号后表达式返回true时运行下面的代码,返回false继续阻塞(这里的话就是当队列非空时运行下面的代码,空的时候继续阻塞),然后让其他消费者去判断。解决思路,让消费者一直阻塞,当生产者生产出东西了通知消费者取消阻塞,用锁可以达到,但是如果有多个消费者不能确定是让哪个消费者来消费,因此使用条件变量。生产者线程每隔三秒生成往队列中放入一个数据,并用条件变量发送信号,然后将生产者线程detach,不用去管理其线程资源。生成三个消费者线程,每个线程也做detach(),.........原创 2022-07-29 19:23:56 · 754 阅读 · 0 评论 -
C++多线程学习08 使用list和互斥锁进行线程通信
01无限循环中要加入sleep,不然可能入口函数可能一直占着CPU,(两个while循环中间隔很短,在这个间隔中CPU不一定能调度去执行其他线程,在这里的表现就是一直运行接收消息队列,发送消息队列一直获取不到锁,消息队列都空了还在接收,这样当然是不行的)stop()将退出标志位置为true,具体的线程类的线程入口会在while循环中通过该标志位来判断是否继续循环,然后调用wait等待当前线程退出。继承自抽象线程类,又定义了一个sendmsg函数,其他线程通过调用该函数来给该具体线程类传递消息(线程通信)..原创 2022-07-29 17:12:20 · 494 阅读 · 0 评论 -
C++多线程学习07 unique_lock与scoped_lock
补充一个关键字noexceptnoexcept形如其名地,表示其修饰的函数不会抛出异常。不过与throw()动态异常声明不同的是,在C++11中如果noexcept修饰的函数抛出了异常,编译器可以选择直接调用std::terminate()函数来终止程序的运行,这比基于异常机制的throw()在效率上会高一些。这是因为异常机制会带来一些额外开销,比如函数抛出异常,会导致函数栈被依次地展开(unwind),并依帧调用在本帧中已构造的自动变量的析构函数等。unique_lock与lock_guard()一样原创 2022-07-05 20:08:56 · 1330 阅读 · 0 评论 -
C++多线程学习06 利用RAII
RAII是C++的发明者Bjarne Stroustrup提出的概念,RAII全称是“Resource Acquisition is Initialization”,直译过来是“资源获取即初始化”,也就是说在构造函数中申请分配资源,在析构函数中释放资源。即使用局部资源来管理对象,在RAII的指导下,我们应该使用类来管理资源,将资源和对象的生命周期绑定。为什么需要用RAII来管理:除去忘了写解锁语句这种低级错误,还可能加锁之后抛出异常,无法正常解锁在RAII的指导下,我们应该使用(XMutex类)来管理资源原创 2022-07-01 12:10:43 · 482 阅读 · 0 评论 -
C++多线程学习05 超时锁,递归锁与共享锁
功能:避免长时间死锁,可以记录锁获取情况,多次超时,可以记录日志,获取错误情况在04中可以由于try_lock()不会阻塞该线程而是一直占着CPU资源,因此加入sleep_for(100ms)延时一会阻塞下该线程给其他线程一点机会,然而这的延时是调用的this_thread下的函数:也可以将延时做为锁的构造函数的参数,使用超时锁timed_mutex:同样的为了确保unlock能释放资源,最后延时一下:创建了三个线程,每个线程尝试解锁之后先阻塞500ms.........原创 2022-06-30 23:12:48 · 2100 阅读 · 0 评论 -
C++ 多线程学习04 多线程状态与互斥锁
初始化→就绪态:操作系统为线程分配好了资源,将其挂载CPU的就绪队列上。就绪→运行:该线程排在就绪队列队首元素,且CPU调度到了该线程(如时间片轮转算法、高响应比优先算法、短作业优先等),将其交给CPU去运行运行→就绪:正在CPU上运行的线程用于CPU的调度中断了运行,挂载就绪队列队尾就绪→阻塞:X运行→阻塞:当进程请求某一资源(如外设)的使用和分配或等待某一事件的发生(如IO操作的完成)时,它就从运行状态转换为阻塞状态。进程以系统调用的形式请求操作系统提供服务,这是一种特殊的、由运行用户态程序调用原创 2022-06-26 11:14:32 · 1238 阅读 · 0 评论 -
C++多线程03 Lambda表达式与caII once
先创建一个对象,该对象有一个成员name再调用该类的start方法,该方法将一个Lambda表达式包装成线程,并让该线程阻塞主线程,该Lambda表达式做为线程入口,捕获列表捕获了该对象的this指针,指明了打印哪个对象的name![在这里插入图片描述](https://img-blog.csdnimg.cn/2d0ef6ecb74840038a426e4820e8ddee.png)## 二、caII once多线程函数调用,但函数只进入一次比如多个线程都要初始化一个库,但只需要进入一次,可以使用原创 2022-06-26 10:37:28 · 436 阅读 · 0 评论 -
C++多线程学习02 线程的入口参数
可以看到02中无法访问para中的成员,这是因为虽然将子线程与主线程detach了,但只是将其句柄的周期交给了子线程,para的生命周期随着 }结束而结束01与03中使用join(),虽然访问的成员没有经过复制,但用join()阻塞了主线程,使其访问问para后主线程才将释放,因此不会出现问题04中即使将para的创建放在 {}中,其生命周期随着{}的结束而结束,但para在线程的构造函数中进行了复制,因此不会出现问题,正常访问。## 三、成员函数做为线程入口实际应用中经常将对象做为一个线程存原创 2022-06-25 21:54:24 · 478 阅读 · 0 评论 -
c++多线程学习01 对象生命周期和线程的退出与等待
子线程:main函数三种情况:01:这是因为在使用函数指针做为thread的构造函数的参数时,会生成一个句柄 _Thr._Hnd ,这个句柄的生命周期与主线程一致,当主线程结束时该句柄也会被释放掉,由于此时子线程还在运行,因此将会出错02用detach()使子线程与主线程分离,相当于将子线程变成一个守护线程,将其资源如句柄的生命周期交给子线程java的守护线程:守护线程,是指在程序运行时 在后台提供一种通用服务的线程,这种线程并不属于程序中不可或缺的部分。th.join()方法用于把子线程原创 2022-06-25 12:30:26 · 843 阅读 · 1 评论 -
c++的输入输出
00,将getline放在while中会不断读txt中每一行,当读到文件尾时进不去while了01,因此用getline处理文件输入流时最后访问到文件尾,再getline就访问不到新东西了,因此打开两个文件流分别来处理QP和bit02,getline只会识别换行符与设定的分隔符,会将空格保存起来,因此可能要进行去空格操作03,letter.find_last_not_of("0123456789");//从末尾向前找到非数字的索引04,substr()若只有一个参数则是该参数为起点,然后一直到尾部原创 2022-06-16 00:04:40 · 383 阅读 · 0 评论 -
C++的四种强制转换
断点查看运行到*b = 5;时a的值被设为5了,但最后cout的a的值仍然为1why?对于const数据我们更要这样保证:绝对不对const数据进行重新赋值。如果我们不想修改const变量的值,那我们又为什么要去const呢?原因是,我们可能调用了一个参数不是const的函数,而我们要传进去的实际参数却是const的,但是我们知道这个函数是不会对参数做修改的。于是我们就需要使用const_cast去除const限定,以便函数能够接受这个实际参数。...原创 2022-04-27 20:10:17 · 4117 阅读 · 0 评论 -
C++ 虚表与虚析构
在C++中,多态性的实现和联编(也称绑定)这一概念有关。一个源程序经过编译、链接,成为可执行文件的过程是把可执行代码联编(或称装配)在一起的过程。其中在运行之前就完成的联编成为静态联编(前期联编);而在程序运行之时才完成的联编叫动态联编(后期联编)。静态联编支持的多态性称为编译时多态性(静态多态性)。在C++中,编译时多态性是通过函数重载和模板实现的。利用函数重载机制,在调用同名函数时,编译系统会根据实参的具体情况确定索要调用的是哪个函数。动态联编所支持的多态性称为运行时多态(动态多态)。在C++中,运原创 2022-01-27 01:23:57 · 843 阅读 · 0 评论 -
c++智能指针与引用计数
先在堆上new了两个node,一个node用shared_ptr型指针parent管理,一个node用shared_ptr型指针child管理,通过重载的->可以访问管理空间中的成员,parent指针调用其中的setchild函数成员,该函数可以将node类中的shared_ptr sp_parent去管理参数传进来的指针所管理的空间,即sp_parent去管理第二次new时的空间,child指针调用其中的setparent函数成员也是如此。代码中各个对象的关系如下图所示,parent和chi......原创 2022-01-17 18:19:15 · 1664 阅读 · 0 评论 -
C++线程学习
可以看到a存放的寄存器的地址相同,但指令存放的地址不同。并发为交替地进行两个以下的操作,假设每个操作执行X毫秒当子进程加进来后,比如在执行进程1X毫秒后只执行了第一句,假设此时a为5000,然后去执行进程2执行X毫秒a自增了3000,再切换回进程1接着执行之前没有执行完的第二局,a变回5000,在进程2中自增的3000消失掉了。这就是同步带来的问题原创 2022-01-30 01:35:42 · 946 阅读 · 0 评论