欢迎来到第一文库网! | 帮助中心 第一文库网-每个人都是第一
第一文库网
全部分类
  • 研究报告>
  • 学术论文>
  • 全科教育>
  • 应用文档>
  • 行业资料>
  • 企业管理>
  • 技术资料>
  • 生活休闲>
  • ImageVerifierCode 换一换
    首页 第一文库网 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    多线程编程可以应用在哪里?C++多线程详解.docx

    • 资源ID:951229       资源大小:56.35KB        全文页数:21页
    • 资源格式: DOCX        下载积分:10金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: QQ登录 微博登录
    二维码
    扫码关注公众号登录
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    多线程编程可以应用在哪里?C++多线程详解.docx

    多线程编程可以应用在哪里?C+多线程详解在出学习过程中,要想“更上一层楼”的话,多线程编程是必不可少的一步,前面的文章多半是基础方面的内容,这节的话稍微有点拔高。所以说,我们在看这篇文章的时候,大家需要更多的思考是为什么这么做?这样做的好处是什么?以及多线程编程都可以应用在哪里?话不多说,跟着我一起认真探讨这块内容。1、多线程传统的C+(C+11标准之前)中并没有引入线程这个概念,在C+11出来之前,如果我们想要在C+中实现多线程,需要借助操作系统平台提供的也1,比如1inUX的,或者WindOWS下的。C+11提供了语言层面上的多线程,包含在头文件中。它解决了跨平台的问题,提供了管理线程、保护共享数据、线程间同步操作、原子操作等类。C+11新标准中引入了5个头文件来支持多线程编程,如下图所示:11、多进程与多线程多进程并发使用多进程并发是将一个应用程序划分为多个独立的进程(每个进程只有一个线程),这些独立的进程间可以互相通值,共同完成任务。由于操作系统对进程提供了大量的保护机制,以避免一个进程修改了另一个进程的数据,使用多进程比使用多线程更容易写出相对安全的代码。但是这也造就了多进程并发的两个缺点:在进程间的通信,无论是使用信号、套接字,还是文件、管道等方式,其使用要么比较复杂,要么就是速度较慢或者两者兼而有之。运行多个线程的开销很大,操作系统要分配很多的资源来对这些进程进行管理。当多个进程并发完成同一个任务时,不可避免的是:操作同一个数据和进程间的相互通信,上述的两个缺点也就决定了多进程的并发并不是一个好的选择。所以就引入了多线程的并发。多线程并发多线程并发指的是在同一个进程中执行多个线程。优点:有操作系统相关知识的应该知道,线程是轻量级的进程,每个线程可以独立的运行不同的指令序列,但是线程不独立的拥有资源,依赖于创建它的进程而存在。也就是说,同一进程中的多个线程共享相同的地址空间,可以访问进程中的大部分数据,指针和引用可以在线程间进行传递。这样,同一进程内的多个线程能够很方便的进行数据共享以及通信,也就比进程更适用于并发操作。缺点:由于缺少操作系统提供的保护机制,在多线程共享数据及通信时.,就需要程序员做更多的工作以保证对共享数据段的操作是以预想的操作顺序进行的,并且要极力的避免死锁(deb1ock)。12、多线程理解单CPU内核的多个线程。一个时间片运行一个线程的代码,并不是真正意义的并行计算。多个cpu或者多个内核可以做到真正的并行计算。13、创建线程创建线程很简单,只需要把函数添加到线程当中即可。std:threadmyThread(thread_fun);函数形式为VOidthread_fun()myThread.join();同一个函数可以代码复用,创建多个线程形式2:std:threadmyThread(thread-fun(100);myThread.join();函数形式为VOidthread_fun(intx)同一个函数可以代码复用,创建多个线程形式3:std:thread(thread_fun,1).detach();直接创建线程,没有名字函数形式为VOidthread_fun(intx)ForExamp1e使用g+编译下列代码的方式:g+test,cc-0test-Ipthread#inc1udeinc1udeusingnamespacestd;voidthread_1()COUt<<“子线程1,<<end1;)voidthread2(intx)cout<<,z:zz<<x<<end11.4、join与detach方式当线程启动后,一定要在和线程相关联的thread销毁前,确定以何种方式等待线程执行结束。比如上例中的join。detach方式,启动的线程自主在后台运行,当前的代码继续往下执行,不等待新线程结束。join方式,等待启动的线程完成,才会继续往下执行。可以使用joinab1e判断是join模式还是detach模式。if(myThread.joinab1eO)foo.joinO;(1) join举例下面的代码,join后面的代码不会被执行,除非子线程结束。inc1udeinc1udeusingnamespacestd;voidthread_1()whi1e(1)CoUt子线程1111,<<end1;<SPan="">)voidthread_2(intx)(whi1e(1)COUt<<“子线程2222z,«end1;<SPanF"">)intmain()(threadfirst(thread_1);/开启线程,调用:thread_1()threadsecond(thread_2,100);/开启线程,调用:thread_2(100)first,join();/pausesunti1firstfinishes这个操作完了之后才能destroyedsecond,join();/pausesunti1secondfinishesjoin完了之后,才能往下执行。whi1e(1)std:cout</主线程9)return0;(2) detach举例下列代码中,主线程不会等待子线程结束。如果主线程运行结束,程序则结束。ttinc1ude#inc1udeusingnamespacestd;voidthread_1()whi1e(1)COUt子线程111z<<end1;<span="”)voidthread_2(intx)(whi1e(1)(CoUt<X”子线程2222,<<end1;<SPan=)intmainOthreadfirst(thread_1);/开启线程,调用:thread_1()threadsecond(thread2,100);/开启线程,调用:thread2(100)first,detach();second,detach();for(inti=0;i<10;i+)(std:cout«主线程.*return0;1.5、 thisthreadthis_thread是一个类,它有4个功能函数,具体如下:函数使用说明get_idstd:get_id()获取线程idyie1dstd:yie1d()放弃线程执行,回到就绪状态s1eep_forstd:rseconds(1);暂停1秒s1eep_unti1如下一分钟后执行吗,如下usingstd:system_c1ock;std:time_ttt=system_c1ock:to_time_t(system_c1ock:now();structstd:tm*ptm=std:1oca1time(&tt);cout«”Waitingforthenextminutetobegin.9+ptm->tmmin;加一分钟ptm->tm.sec=0;秒数设置为0暂停执行,到下一整分执行this_thread:fromtime_t(mktime(ptm);2、mutexInUteX头文件主要声明了与互斥量(mutex)相关的类。mutex提供了4种互斥类型,如下表所示。类型说明最基本的Mutex类。递归Mutex类。定时Mutex类。定时递归Mutex类。std:mutexstd:!recursivemutexstd:timemutexstd:Irecursivetimedmutexstd:mutex是C+11中最基本的互斥量,std:mutex对象提供了独占所有权的特性即不支持递归地对std:mutex对象上锁,而std:recursive_1ock则可以递归地对互斥量对象上锁。21、IoCk与Un1OCkmutex常用操作:1ock():资源上锁un1ock():解锁资源try1ock0:查看是否上锁,它有下列3种类情况:(1)未上锁返回fa1se,并锁住;(2)其他线程已经上锁,返回true;(3)同一个线程己经对它上锁,将会产生死锁。死锁:是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。下面结合实例对IOCk和Un1oCk进行说明。同一个mutex变量上锁之后,一个时间段内,只允许一个线程访问它。例如:#inc1ude/inc1ude/inc1ude/std:coutstd:threadstd:mutexstd:mutexmtx;/mutexforcritica1sectionvoidprintb1ock(intn,charc)(/critica1section(exc1usiveaccesstostd:coutsigna1edby1ockingmtx):mtx.1ock();for(inti=0;i(std:cout«c;std:cout«,mtx.un1ockO;)intmainO(std:threadth1(PrintbIoCk,50,'')线程1:打印*std:threadth2(Printb1oCk,50,'$');线程2:打印$th1.join();th2.join();return0;输出:$如果是不同mutex变量,因为不涉及到同一资源的竞争,所以以下代码运行可能会出现交替打印的情况,或者另一个线程可以修改共同的全局变量!inc1ude/std:coutftinc1ude/std:thread#inc1ude/std:mutexstd:mutexmtx_1;/mutexforcritica1sectionstd:mutexmtx_2;/mutexforcritica1sectioninttest_num=1;voidprint_b1ock_1(intn,charc)(/critica1section(exc1usiveaccesstostd:coutsigna1edby1ockingmtx):mtx_1.IockO;for(inti=0;i/std:cout«c;testnum=1;std:cout«test_num«std2.2>1ock_guard创建IoCkgUarC1对象时,它将尝试获取提供给它的互斥锁的所有权。当控制流离开1ockguard对象的作用域时,IoCkguard析构并释放互斥量。1ockguard的特点:创建即加锁,作用域结束自动析构并解锁,无需手工解锁不能中途解锁,必须等作用域结束才解锁不能复制代码举例#inc1udeinc1ude#inc1udeintg_i-O;std:mutexg_i_mutex;/protectsg_i>用来保护g_ivoidsafe_increment()conststd:1ockguard1ock(g_imut

    注意事项

    本文(多线程编程可以应用在哪里?C++多线程详解.docx)为本站会员(lao****ou)主动上传,第一文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知第一文库网(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2022 001doc.com网站版权所有   

    经营许可证编号:宁ICP备2022001085号

    本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有,必要时第一文库网拥有上传用户文档的转载和下载权。第一文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知第一文库网,我们立即给予删除!



    收起
    展开