第5章 Win32 API 多线程编程.ppt
《第5章 Win32 API 多线程编程.ppt》由会员分享,可在线阅读,更多相关《第5章 Win32 API 多线程编程.ppt(40页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Neusoft Institute of Information14 一月 2023IT Education&Training大连东软信息学院大连东软信息学院 多核编程多核编程课程组课程组多核编程多核编程2023/1/14Neusoft Institute of Information14 一月 2023IT Education&Training第第5章章 Windows API 多线程编程多线程编程 2023/1/14Neusoft Institute of Information14 一月 2023IT Education&Training 目 标 创建,终止线程的方法 利用同步对象协调线
2、程的运行和内存访问资源互斥数据共享2023/1/14Neusoft Institute of Information14 一月 2023IT Education&Training1.Win32 句柄定义:内核对象是由操作系统内核分配的,只能由内核访问的一个内存块,用来供系统和应用程序使用和管理各种系统资源。线程对象、事件对象、文件对象、文件映射对象、作业对象、互斥量、管道对象、进程对象、信标对象和等待计时器对象等。对象都是通过调用函数来创建的。2023/1/14Neusoft Institute of Information14 一月 2023IT Education&Training2.Wi
3、n32 Thread CreationHANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,/在系统中使用方法进程高级设置 DWORD dwStackSize,/线程堆栈大小 LPTHREAD_START_ROUTINE lpStartAddress,/函数指针,指向实际运行的代码 LPVOID lpParameter,/参数指针 DWORD dwCreationFlags,/设置标志 LPDWORD lpThreadId);/线程ID2023/1/14Neusoft Institute of Information14 一月
4、 2023IT Education&TrainingLPTHREAD_START_ROUTINE DWORD WINAPI MyThreadStart(LPVOID p);2023/1/14Neusoft Institute of Information14 一月 2023IT Education&Training3.线程的终止BOOL CloseHandle(HANDLE hObject);2023/1/14Neusoft Institute of Information14 一月 2023IT Education&Training例子:线程的创建#include#include DWORD
5、 WINAPI helloFunc(LPVOID arg)printf(“Hello Threadn”);return 0;main()HANDLE hThread=CreateThread(NULL,0,helloFunc,NULL,0,NULL);What Happens?主线程执行太快,子线程没有执行2023/1/14Neusoft Institute of Information14 一月 2023IT Education&Training 4.线程的等待#include#include BOOL threadDone=FALSE;DWORD WINAPI helloFunc(LPVO
6、ID arg)printf(“Hello Threadn”);threadDone=TRUE;return 0;main()HANDLE hThread=CreateThread(NULL,0,helloFunc,NULL,0,NULL);while(!threadDone);/wasted cycles!Not a good idea!Not a good idea!2023/1/14Neusoft Institute of Information14 一月 2023IT Education&Training 4.线程的等待v原型:v等待一个线程DWORD WaitForSingleObje
7、ct(等待的对象等待的对象)HANDLE hHandle,(等待的时间(等待的时间 )DWORD dwMilliseconds);2023/1/14Neusoft Institute of Information14 一月 2023IT Education&Training多个线程的等待v原型 v The WaitForMultipleObjects()function has the following parameters:nCountlpHandlesfWaitAlldwMillisecondsDWORD WaitForMultipleObjects(DWORD nCount,CONST
8、 HANDLE*lpHandles,/array BOOL fWaitAll,/wait for one or all DWORD dwMilliseconds);Wait for all:Wait for all:fWaitAllfWaitAll=TRUETRUEWait for aWait for anyny:fWaitAllfWaitAll=FALSEFALSE2023/1/14Neusoft Institute of Information14 一月 2023IT Education&Training例子const int numThreads=4;DWORD WINAPI hello
9、Func(LPVOID arg)printf(“Hello Threadn”);return 0;main()HANDLE hThreadnumThreads;for(int i=0;i numThreads;i+)hThreadi=CreateThread(NULL,0,helloFunc,NULL,0,NULL);WaitForMultipleObjects(numThreads,hThread,TRUE,INFINITE)2023/1/14Neusoft Institute of Information14 一月 2023IT Education&Training问题DWORD WINA
10、PI threadFunc(LPVOID pArg)int*p=(int*)pArg;int myNum=*p;printf(“Thread number%dn”,myNum);./from main():for(int i=0;i numThreads;i+)hThreadi=CreateThread(NULL,0,threadFunc,&i,0,NULL);输出的结果是什么?输出的结果是什么?输出的结果是什么?输出的结果是什么?2023/1/14Neusoft Institute of Information14 一月 2023IT Education&Training分析下面的表将说明出
11、现问题的原因 myNum=*pmyNum=2exitwaitT6p=pArgprint(2)waitT5launchmyNum=*pmyNum=2i+(i=2)T4-p=pArgcreate(&i)T3-launchi+(i=1)T2-create(&i)T1-i=0T0Thread 1Thread()Main Time 2023/1/14Neusoft Institute of Information14 一月 2023IT Education&Training5 多线程问题数据竞争在多线程应用将遇到的问题在多线程应用将遇到的问题多线程问题Deadlocks死锁Livelocks活锁Gran
12、ularity粒度Load Imbalance负载平衡Data Races数据竞争2023/1/14Neusoft Institute of Information14 一月 2023IT Education&Training数据竞争Read/Write 竞争Write/Write 竞争5 多线程问题数据竞争2023/1/14Neusoft Institute of Information14 一月 2023IT Education&Training如何解决数据竞争v在多线程应用中避免数据竞争的两种方法:将变量的应用范围具体到每一个线程内部o变量声明在线程内o线程本地化Thread Local
13、 Storage(TLS)以临界的方法控制并行访问同步对象:oMutex 互斥oSemaphore 信号量oEvent 事件oCritical section 临界区2023/1/14Neusoft Institute of Information14 一月 2023IT Education&Training5.1 本地存储DWORD WINAPI threadFunc(LPVOID pArg)int myNum=*(int*)pArg);printf(“Thread number%dn”,myNum);.for(int i=0;i numThreads;i+)tNumi=i;hThreadi
14、=CreateThread(NULL,0,threadFunc,&tNumi,0,NULL);2023/1/14Neusoft Institute of Information14 一月 2023IT Education&TrainingoMutex 互斥oSemaphore 信号量oEvent 事件oCritical section 临界区5.2 同步对象2023/1/14Neusoft Institute of Information14 一月 2023IT Education&Training5.2.1 互斥量特点内核对象被一个线程拥有进程、线程间的同步 跨进程进行同步访问。为获得一个信
15、号量要进行内核调用,开销大相关接口:CreateMutex()/创建互斥量WaitForSingleObject()/等待、加锁ReleaseMutex()/解锁2023/1/14Neusoft Institute of Information14 一月 2023IT Education&Training5.2.2 临界区v特点:轻量级常用非内核对象v相关接口:v CRITICAL_SECTION cs /定义临界区 IntializeCriticalSection(&cs)/初始化临界区DeleteCriticalSection(&cs)/注销临界区void WINAPI Initializ
16、eCriticalSection(LPCRITICAL_SECTION lpCriticalSection);void WINAPI DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);2023/1/14Neusoft Institute of Information14 一月 2023IT Education&Training5.2.2 临界区 EnterCriticalSection(&cs)/进入临界区LeaveCriticalSection(&cs)/退出临界区当临界区有其他线程时,线程将被阻塞不返回。当临界区没有线程
17、时将返回void WINAPI EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);2023/1/14Neusoft Institute of Information14 一月 2023IT Education&Training例子:临界区#define NUMTHREADS 4CRITICAL_SECTION g_cs;/为什么定义成全局变量int g_sum=0;DWORD WINAP
18、I threadFunc(LPVOID arg)int mySum=bigComputation();EnterCriticalSection(&g_cs);g_sum+=mySum;/每次只有一个线程访问 LeaveCriticalSection(&g_cs);return 0;main()HANDLE hThreadNUMTHREADS;InitializeCriticalSection(&g_cs);for(int i=0;i NUMTHREADS;i+)hThreadi=CreateThread(NULL,0,threadFunc,NULL,0,NULL);WaitForMultipl
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第5章 Win32 API 多线程编程 多线程 编程
限制150内