




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、4.21.概述2.多线程模型3.线程库4.隐式线程5.若干线程问题4.4n 线程(轻型进程lightweight process, LWP )是CPU使用的一个基本单元,包括l线程IDl程序计数器l寄存器集l栈空间lTCB(Thread Control Block)n传统的或重型进程(heavyweight process)等价于只有一个线程的任务n调度线程是调度的基本单位,同一进程中的线程切换不会引起进程切换n并发线程可以提高系统的并发性n资源进程拥有资源,是资源分配的基本单位,而线程则不拥有资源,但它可以访问创建它的进程所拥有的资源n上下文切换线程的上下文切换的代价比进程
2、小4.8n很多现代引用程序有多线程的要求n线程位于进程内n一个进程内的多个任务能利用多个线程执行l更新网页显示l接受数据l拼写检查n执行相似任务l服务器发送网页n进程创建:重量级n线程创建:轻量级n简化代码增加效率4.94.10n响应度高n资源共享n经济性nMP体系结构的运用线程优点线程优点4.11n单核系统并发单核系统并发:n多核系统并行多核系统并行:4.13n由用户级线程库进行管理的线程n 内核看不到用户线程,线程的创建和调度在用户空间,不需要内核的干预 n例子- POSIX Pthreads- Win32 threads- Java threads4.14n内核支持,操作系统管理的线程n
3、例子lWindows XP/2000lSolarislLinuxlTru64 UNIXlMac OS X4.15n多对一模型n一对一模型n多对多模型4.16n多个用户级线程映射到一个内核线程n多个线程不能并行运行在多个处理器上n线程管理在用户态执行,因此是高效的,但一个线程的阻塞系统调用会导致整个进程的阻塞n用于不支持内核线程的系统中n例子:lSolaris Green ThreadslGNU Portable Threads4.17n每个用户级线程映射到一个内核线程n比多对一模型有更好的并发性n允许多个线程并行运行在多个处理器上n创建一个ULT需要创建一个KLT,效率较差n例子lWindow
4、s 95/98/NT/XP/2000lLinuxlSolaris 9 and laterlOS/24.18n多个用户级线程映射为相等或小于数目的内核线程n允许操作系统创建足够多的内核线程n例子lSolaris 9 以前的版本l带有ThreadFiber开发包的Windows NT/2000 4.19n类似于 M:M, 只不过它允许一个用户线程绑定到内核线程n例子lIRIXlHP-UXlTru64 UNIXlSolaris 8 and earlier4.21n为程序员提供了创建和管理线程的APIn类型l用户级线程库l内核级线程库n主要线程库:lWindows 线程库 :内核级lPthread线程
5、库 :用户级或内核级lJAVA线程库 :用户级4.22n1对1映射n每个线程包括:l线程 idl寄存器集合l堆栈l私有数据n线程主要的数据结构:lETHREAD (executive thread block):执行线程块lKTHREAD (kernel thread block):核心线程块lTEB (thread environment block):线程环境块4.234.24HANDLE CreateThread (LPSECURITY_ATTRIBUTES ,SIZE_T , LPTHREAD_START_ROUTINE ,LPVOID , DWORD , LPDWORD ); 是指向
6、线程函数的指标。函数名称没有限制,但是必须以下列形式声明:DWORD WINAPI ThreadProc (PVOID pParam) ; 为传递给ThreadProc的参数。这样主线程和从属线程就可以共享数据。4.25nhThread = _beginthread (ThreadProc, uiStackSize, pParam) ; 语法为:void _cdecl ThreadProc (void * pParam) ; 4.264.27n设置线程的优先级设置线程的优先级l线程优先级 = 进程优先级 + 线程相对优先级lBool SetThreadPriority (HANDLE hPri
7、ority , int nPriority)n每个线程都有挂起计数器(suspend count) ,为0 时线程被执行;大于0 时调度器不去调度该线程lDWORD SuspendThread(HANDLE hThread);lDWORD ResumeThread(HANDLE hThread);4.28n线程等待lDWORD (HANDLE hObject, / 等待的核心对象 DWORD dwTimeout ) ; / 线程愿意等待的毫秒数(值为INFINITE时表示无限等待) (DWORD cObject, / 检查核心对象的数目 LPHANDLE lpHandles, / 指向这些对象
8、的句柄的数组 BOOL bWaitAll, / 是否等待所有对象变成有信号 DWORD dwTimeout); / 线程愿意等待的时间(毫秒数) n线程内终止线程lVOID ExitThread (DWORD dwExitCode) ;n线程外终止线程 lBOOL TerminateThread (HANDLE hThread, DWORDdw ExitCode) ;n4.29#include stdafx.h#include #include using namespace std;DWORD WINAPI FunOne(LPVOID param) while(true) Sleep(100
9、0); couthello! ; return 0; DWORD WINAPI FunTwo(LPVOID param) while(true) Sleep(1000); coutinput; if(input=1) ResumeThread(hand1);ResumeThread(hand2); else SuspendThread(hand1);SuspendThread(hand2); ; TerminateThread(hand1,1); TerminateThread(hand2,1); return 0;4.31nLinux用“任务”这个术语,一般不用“线程”n线程可以通过 clo
10、ne() 系统调用创建nclone() 类fork()4.32nA POSIX 标注(IEEE 1003.1c) ,用于线程创建和同步n提供了线程有关的API接口n常用于UNIX类操作系统 (Solaris, Linux, Mac OS X)4.33n使用fork() 创建进程 l代价昂贵l进程间通信方式较复杂l操作系统在实现进程间的切换比线程切换更费时 n使用pthreads库创建线程l创建进程比创建线程更快l线程间的通信方式更容l操作系统对线程的切换比对进程的切换更容易和快速 4.34#include int pthread_create(pthread_t * thread, pthre
11、ad_attr_t * attr, void *(*start_routine)(void *), void * arg); n第一个参数为指向线程标识符的指针n第二个参数用来设置线程属性n第三个参数是线程运行函数的起始地址n最后一个参数是运行函数的参数4.35#include#include#include#include#includepthread_t ntid;void *thr_fn(void *arg) printids(new thread:); return (void *)0);int main() int err; err = pthread_create(&nti
12、d,NULL,thr_fn,NULL); if(err != 0) printf(cant create thread: %sn,strerror(err); return 1; sleep(1); return 0;ngcc -o mypthread -lpthread mypthread.c4.36n调用pthread_exit()结束线程执行 lvoid pthread_exit(void *retval); n使用 pthread_cancel() 函数终止其他线程的执行 lint pthread_cancel(pthread_t thread); l向线程t发送取消请求,默认情况下线
13、程thread自己调用pthread_exit(PTHREAD_CANCELED), 4.37n pthread_join() 函数等待被创建的线程结束 npthread_join() 函数会挂起创建线程的线程的执行 ,直到等待到想要等待的子线程 n函数原型 : int pthread_join(pthread_t th, void *thread_return); 4.38#include #include #include #include #define THREAD_NUMBER 2int retval_hello1= 2, retval_hello2 = 3;void* hello1
14、(void *arg) char *hello_str = (char *)arg; sleep(1); printf(%sn, hello_str); pthread_exit(&retval_hello1);void* hello2(void *arg) char *hello_str = (char *)arg; sleep(2); printf(%sn, hello_str); pthread_exit(&retval_hello2);4.39int main(int argc, char *argv) int i; int ret_val, ret_val2; int
15、 *retval_hello2; pthread_t ptTHREAD_NUMBER; const char *argTHREAD_NUMBER; arg0 = hello world from thread1; arg1 = hello world from thread2; printf(Begin to create threads.n); ret_val1 = pthread_create(&pt0, NULL, hello1, (void *)arg0); ret_val2 = pthread_create(&pt1, NULL, hello2, (void *)ar
16、g1); 4.40 printf(Begin to wait for threads.n); for(i = 0; i THREAD_NUMBER; i+) ret_val = pthread_join(pti, (void *)&retval_helloi); if (ret_val != 0) printf(pthread_join error!n); exit(1); else printf(return value is %dn, *retval_helloi); printf(Now, the main thread returns.n); return 0;4.41nJav
17、a 线程由JVM管理nJava 线程创建l扩展java.lang.Thread类l实现Runnable接口4.42npublic class DoSomething implements Runnable private String name; public DoSomething(String name) = name; public void run() System.out.println(name + : + i); 4.43npublic class TestRunnable public static void main(String args) DoSome
18、thing ds1 = new DoSomething(“1); DoSomething ds2 = new DoSomething(“2); Thread t1 = new Thread(ds1); Thread t2 = new Thread(ds2); t1.start(); t2.start(); 4.444.46n随着进程中线程数量的增加,编程越来越大困难n新方法:由编译器或运行库创建或管理线程n三种模式:lThread PoolslOpenMPlGrand Central Dispatchn其它方法lMicrosoft Threading Building Blocks (TBB)ljava.util.concurrent package4.47n在池中创建一批线程,等到任务n优点:l利用线程池中的线程来响应请求比创建一个线程更加快速l允许一个应用程序中的线程数量达到线程池的上限nWindows API支持线程池:4.48nC, C+, FORTRAN 支持n并行程序设计方法n识别并行区间#pragma omp parallel n例子例子#pragma
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 心理资本与学习动力企业培训的新视角
- 教育技术在远程办公中的实践与思考
- 教育品牌在数字时代的品牌塑造与传播
- 培养孩子学习兴趣从心理学角度出发的教育方法探讨
- 教育行业未来趋势与学习路劲规划
- 智慧教育与学生学习动力的关系研究
- 从数据泄露看教育技术的伦理困境
- 教育心理学与教师决策实践与探索
- 中职思政课课件
- 2025届安徽省池州一中物理高一下期末教学质量检测试题含解析
- 矿山救护规程课件
- 脑出血的术后护理课件
- 橡胶制品在电力电气行业中的应用研究
- 《动态流量平衡阀》课件
- 跨境电商的法规和政策解读与分析
- 电子科技大学《移动通信原理》第七章IS95及其增强移
- 国家中小学智慧教育平台培训专题讲座
- 7个生活中沟通成功案例 3篇
- 《得道多助-失道寡助》对比阅读6篇(含答案)
- -2024届高考英语二轮复习:读后续写适用句型-定语从句课件
- 粮油、调料配送投标方案(技术标)
评论
0/150
提交评论