操作系统
文章平均质量分 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 评论 -
CPU眼里的: MMU | 空间独立性|虚拟内存
内存中拆分的基本单位称为页(内存分页,一个页4K),拆分开的进程与拆分开的内存通过页表进行映射,页表由页表项组成,每个页表项指出当前进程的代码在内存中映射到哪一页,在该页中的偏移地址是多少。如上图0x00003005的0x00003让MMU查看页表第3行的值,也就是0x80003000,也就是虚拟内存页对应的物理内存页的起始地址,其低12位(12位刚好可以访问到4K的地址,即一个页表都能访问到)005指该虚拟地址在内存页中对应第5个。至此得到了虚拟地址在内存上物理地址的映射为0x80003005。.....原创 2022-06-03 16:31:20 · 566 阅读 · 0 评论