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

上传人:lao****ou 文档编号:951229 上传时间:2024-08-02 格式:DOCX 页数:21 大小:56.35KB
下载 相关 举报
多线程编程可以应用在哪里?C++多线程详解.docx_第1页
第1页 / 共21页
多线程编程可以应用在哪里?C++多线程详解.docx_第2页
第2页 / 共21页
多线程编程可以应用在哪里?C++多线程详解.docx_第3页
第3页 / 共21页
多线程编程可以应用在哪里?C++多线程详解.docx_第4页
第4页 / 共21页
多线程编程可以应用在哪里?C++多线程详解.docx_第5页
第5页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《多线程编程可以应用在哪里?C++多线程详解.docx》由会员分享,可在线阅读,更多相关《多线程编程可以应用在哪里?C++多线程详解.docx(21页珍藏版)》请在第一文库网上搜索。

1、多线程编程可以应用在哪里?C+多线程详解在出学习过程中,要想“更上一层楼”的话,多线程编程是必不可少的一步,前面的文章多半是基础方面的内容,这节的话稍微有点拔高。所以说,我们在看这篇文章的时候,大家需要更多的思考是为什么这么做?这样做的好处是什么?以及多线程编程都可以应用在哪里?话不多说,跟着我一起认真探讨这块内容。1、多线程传统的C+(C+11标准之前)中并没有引入线程这个概念,在C+11出来之前,如果我们想要在C+中实现多线程,需要借助操作系统平台提供的也1,比如1inUX的,或者WindOWS下的。C+11提供了语言层面上的多线程,包含在头文件中。它解决了跨平台的问题,提供了管理线程、保

2、护共享数据、线程间同步操作、原子操作等类。C+11新标准中引入了5个头文件来支持多线程编程,如下图所示:11、多进程与多线程多进程并发使用多进程并发是将一个应用程序划分为多个独立的进程(每个进程只有一个线程),这些独立的进程间可以互相通值,共同完成任务。由于操作系统对进程提供了大量的保护机制,以避免一个进程修改了另一个进程的数据,使用多进程比使用多线程更容易写出相对安全的代码。但是这也造就了多进程并发的两个缺点:在进程间的通信,无论是使用信号、套接字,还是文件、管道等方式,其使用要么比较复杂,要么就是速度较慢或者两者兼而有之。运行多个线程的开销很大,操作系统要分配很多的资源来对这些进程进行管理

3、。当多个进程并发完成同一个任务时,不可避免的是:操作同一个数据和进程间的相互通信,上述的两个缺点也就决定了多进程的并发并不是一个好的选择。所以就引入了多线程的并发。多线程并发多线程并发指的是在同一个进程中执行多个线程。优点:有操作系统相关知识的应该知道,线程是轻量级的进程,每个线程可以独立的运行不同的指令序列,但是线程不独立的拥有资源,依赖于创建它的进程而存在。也就是说,同一进程中的多个线程共享相同的地址空间,可以访问进程中的大部分数据,指针和引用可以在线程间进行传递。这样,同一进程内的多个线程能够很方便的进行数据共享以及通信,也就比进程更适用于并发操作。缺点:由于缺少操作系统提供的保护机制,

4、在多线程共享数据及通信时.,就需要程序员做更多的工作以保证对共享数据段的操作是以预想的操作顺序进行的,并且要极力的避免死锁(deb1ock)。12、多线程理解单CPU内核的多个线程。一个时间片运行一个线程的代码,并不是真正意义的并行计算。多个cpu或者多个内核可以做到真正的并行计算。13、创建线程创建线程很简单,只需要把函数添加到线程当中即可。std:threadmyThread(thread_fun);函数形式为VOidthread_fun()myThread.join();同一个函数可以代码复用,创建多个线程形式2:std:threadmyThread(thread-fun(100);my

5、Thread.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:zzxend11.4、join与detach方式当线程启动后,一定要

6、在和线程相关联的thread销毁前,确定以何种方式等待线程执行结束。比如上例中的join。detach方式,启动的线程自主在后台运行,当前的代码继续往下执行,不等待新线程结束。join方式,等待启动的线程完成,才会继续往下执行。可以使用joinab1e判断是join模式还是detach模式。if(myThread.joinab1eO)foo.joinO;(1) join举例下面的代码,join后面的代码不会被执行,除非子线程结束。inc1udeinc1udeusingnamespacestd;voidthread_1()whi1e(1)CoUt子线程1111,end1;)voidthread_

7、2(intx)(whi1e(1)COUt“子线程2222z,end1;)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举例下列代码中,主线程

8、不会等待子线程结束。如果主线程运行结束,程序则结束。ttinc1ude#inc1udeusingnamespacestd;voidthread_1()whi1e(1)COUt子线程111zend1;span=”)voidthread_2(intx)(whi1e(1)(CoUtX”子线程2222,end1;SPan=)intmainOthreadfirst(thread_1);/开启线程,调用:thread_1()threadsecond(thread2,100);/开启线程,调用:thread2(100)first,detach();second,detach();for(inti=0;itm

9、min;加一分钟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:mu

10、tex对象上锁,而std:recursive_1ock则可以递归地对互斥量对象上锁。21、IoCk与Un1OCkmutex常用操作:1ock():资源上锁un1ock():解锁资源try1ock0:查看是否上锁,它有下列3种类情况:(1)未上锁返回fa1se,并锁住;(2)其他线程已经上锁,返回true;(3)同一个线程己经对它上锁,将会产生死锁。死锁:是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。下面结合实例对IOCk和Un1oCk进行

11、说明。同一个mutex变量上锁之后,一个时间段内,只允许一个线程访问它。例如:#inc1ude/inc1ude/inc1ude/std:coutstd:threadstd:mutexstd:mutexmtx;/mutexforcritica1sectionvoidprintb1ock(intn,charc)(/critica1section(exc1usiveaccesstostd:coutsigna1edby1ockingmtx):mtx.1ock();for(inti=0;i(std:coutc;std:cout,mtx.un1ockO;)intmainO(std:threadth1(Pr

12、intbIoCk,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_n

13、um=1;voidprint_b1ock_1(intn,charc)(/critica1section(exc1usiveaccesstostd:coutsigna1edby1ockingmtx):mtx_1.IockO;for(inti=0;i/std:coutc;testnum=1;std:couttest_numstd2.21ock_guard创建IoCkgUarC1对象时,它将尝试获取提供给它的互斥锁的所有权。当控制流离开1ockguard对象的作用域时,IoCkguard析构并释放互斥量。1ockguard的特点:创建即加锁,作用域结束自动析构并解锁,无需手工解锁不能中途解锁,必须等作用域结束才解锁不能复制代码举例#inc1udeinc1ude#inc1udeintg_i-O;std:mutexg_i_mutex;/protectsg_i用来保护g_ivoidsafe_increment()conststd:1ockguard1ock(g_imut

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 应用文档 > 工作总结

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

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

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



客服