admin管理员组文章数量:1647004
新手学C++多线程编程(3)线程
转载▼C++多线程编程(3)
线程
1.线程(thread): 一种轻量级进程。与进程相比,线程给操作系统带来的创建、维护和管理负担要轻,因为与线程相关信息非常少。
线程也有上下文(只包含一个堆栈、一个寄存器组<程序或指令指针以及堆栈指针>和一个优先权),当线程被抢先时,必定发生线程间的上下文切换。线程没有地址空间,线程包含在进程的地址空间中。线程文本包含在它的进程文本片断中。进程拥有的所有资源都属于线程。其他信息如规划计数等都由进程所定义。
2.多线程处理:
如下图:
3.线程与进程异同点:
4.线程优点:
(1)多线程可以提供子任务的异步执行,这种方式对上下文切换所花的开销和资源较少,而并发多进程(一个进程一个线程)开销较大。
(2)多线程可以增加应用程序的吞吐能力。整个应用程序不能等待每个I/O请求的完成,其他不依赖于阻塞线程的任务可以执行。
(3)线程不需要子任务间的特殊通信机制(进程间通信方式),线程可以轻易直接的在任务间传递与接收数据,线程通过使用进程内所有线程共享的内存(变量)来通信,而进程通过共享内存来通信,有单独地址空间,共享内存位于两个进程地址空间之外。
5.线程缺点:
(1)线程需要同步并发访问内存,则必须进行线程同步化。线程A试图写内存地址,线程B正写入同样地址,线程C负责读取保存在该内存地址的值,并用于计算中。此时线程需要同步化,在线程B覆盖值之前,让线程C可以读取线程A保存在内存地址中的值。线程同步化:当发生写时,必须发生读。
(2)线程可能产生影响所有线程的进程(内存空间)的数据错误,而进程的数据错误只限制于单个进程,其他进程将继续执行。
(3)线程依赖于它所属的进程并且不能退出到创建它的进程之外;而进程更独立可以保护资源不被其他进程随意访问,也可以打包成模块供其他应用程序来使用。
6.线程类型(策略):休眠(sleeper)和单步(one-shot)、先占工作(anticipating work)、延迟工作(deferring work)。
(1)休眠线程: 直到某事件发生前线程一直挂起,执行任务后再次挂起,等待事件再次发生。
(2)单步线程:直到某事件发生前线程一直挂起,执行任务一次后就终止。(实际上就是休眠线程)
如监视COM端口:当端口激活时,线程一直挂起,但当COM端口非激活时,线程苏醒并监视停止工作的过程。如果停止工作超过5000ms时,线程关闭通信端口,此时该监视线程不再监视任何对象,于是可以终止了。
如监视打印机:当某个任务放入队列中时,线程将此任务发送到打印机。队列中可能有多个任务,所以线程被挂起,直到它必须再次执行为止。
(3)先占工作:线程在被请求前已在执行某任务。这个动作可能被请求了,也可能没有被请求。
(3)延迟工作:线程将(非关键性低优先级)任务推迟到将来某个点(分离线程)执行该任务。
7.线程相关信息:
8.线程创建:
9.每个线程维护一个在进程内存中自动分配的堆栈。堆栈的大小必须足够大,用于调用即将创建线程的所有函数、函数的参数以及由每个函数创建的局部变量。在线程终止时释放为堆栈分配的内存。
10.线程的终止:(1)当线程返回到创建它的函数时自动终止。线程的资源被释放。(2)显式调用一个线程终止函数,则任何等待该线程的终止的线程都将受到终止进程ID或线程终止信号。(3)使用一个终止线程堆栈的指针,指针将由于堆栈的销毁而变得无用,并导致整个进程的终止。(4)进程内一个线程可以强迫另一个线程终止,但不能强迫自己终止。强迫终止如果没有反应或执行不正确,则必须销毁该线程。
POSIX: void pthread_exit(void *status); //线程退出
OS/2:
Win32: BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);//终止线程
11.分离线程:
12.远程线程:一个进程中的线程可创建另一个进程中的线程。创建过程与在同一进程中创建线程相似。
13.线程堆栈:堆栈必须足够大,适应于线程的任何函数调用、进程外部的任何代码(如库代码)以及局部变量存储。进程的地址空间必须足以容纳文本、数据片段以及它的所有线程堆栈。
14.线程控制:进程内的线程被看做是同位体,对资源有同样的访问权限,相互施加同等的控制。线程间可以相互通信,不必创建特殊的通信机制。线程既可以销毁(包括主线程)也可以创建其他线程。
15.挂起和恢复线程:线程可以挂起进程内另一个线程的执行。挂起线程直到调用一个恢复它的函数时才会执行。进程内的任何线程都可以恢复挂起线程,除了挂起线程自己。线程可以在指定时间段内挂起自身。
16.线程优先权:在抢占式操作系统中,操作系统保持对处理器的控制权。如果较高优先权的线程可用、运行线程发出了一个I/O请求或被挂起。
线程饥饿:较高优先权的线程将主宰处理器,剥夺了其他线程有用的处理器时间。
使用动态优先权机制改变线程优先权。
17.优先权(priority)包括一个优先类(priority class)和一个优先级(priority level)。
线程优先权:基优先权(base prority)。改变优先权是给基优先权添加一个值。如果级别提升,则在基中添加一个正值。如果级别降低,则添加一个负值。
主线程可以更改它的任何线程的优先权。如果更改优先类,将同时改变进程中所有线程的优先权,同时更改子进程的线程还没有更改的默认优先权。
18.提升线程优先权
【注意】后台进程的优先权应比前台进程的优先权设置的低一些。前台进程的线程先于后台进程的线程使用处理器。当后台进程变成前台进程时,该进程的所有线程都将被推进或提升(即允许前台线程有能力对用户迅速做出反应)。
19.优先权倒置现象:当一个较低优先权线程锁定一个资源,而该资源正是另一个较高优先权线程所需要的,那么较低优先权线程将不能释放资源,较高优先权的线程(但比需要该资源的线程优先权低)阻塞了低优先权线程。
防止优先权倒置解决方法:协议(protocol)临时提升锁定资源的线程的优先权,防止被抢占,使得资源可以释放。该优先权必须高于或等于能够锁定该资源的所有线程的优先权。锁定资源意味着当使用该线程时,其他线程就不能访问它,直到使用它的线程完成。当资源被某个线程使用时,试图访问该资源的其他线程被阻塞。使用资源的该线程优先权被提升到高于阻塞线程,让这个线程使用和释放资源而不被抢占。
解决方法1:当线程2锁定Count时,优先权提升到高于线程3的优先权,允许线程2锁定、更新、取消锁定释放资源,而不被线程3或线程1抢占。在释放count后,线程2的优先权被减小到它的原始级别。
20.优先权原则:
21.线程是处理器上可规划单元。
22.具有多线程的进程状态:
23.线程与资源:对于内存、处理器和其他全局分配资源,线程都要与进程的其他线程以及其他进程的线程来竞争。一些操作系统允许用户设置单个线程的竞争域。
24.线程实现模型:用户级线程、核心级线程、混合级线程。
版权声明:本文标题:新手学C++多线程编程(3)线程 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1729477753a1202255.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论