欢迎来到天天文库
浏览记录
ID:41032599
大小:80.50 KB
页数:7页
时间:2019-08-14
《Windows核心编程之线程同步》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、《WINDOWS核心编程》之五--线程的同步用户方式中线程的同步 1.线程间的互锁有时线程的某些步骤需要以原子的方式来进行操作,尤其涉及到线程对内存,资源的访问的时候。Windows中,解决这个问题的办法之一就是对线程中某些操作进行互锁。那么这些操作就会不被中断而进行。比如,使线程互锁以对某个变量值进行递增操作的函数:LONGInterlockedExchangeAdd(PLONGplAddend,LONGIncrement);举一例:longg_x=0;DWORDWINAPIThreadFun1(PVOIDpvParam){InterlockedExchangeA
2、dd(&g_x,1);}DWORDWINAPIThreadFun2(PVOIDpvParam){InterlockedExchangeAdd(&g_x,2);} 通过这个小小的修改,g_x就可以以原子的方式来进行递增。不必清楚地了解互锁函数是如何工作的。重要的是要知道,无论编译器怎样生成代码,无论计算机中安装了多少个CPU,它们都能保证以原子操作方式来修改一个值。还必须保证传递给这些函数的变量地址正确地对齐,否则这些函数就会运行失败 还有几个修改变量的互锁函数如下所示://改变某个变量值LONGInterlockedExchange(PLONGplTarget,LO
3、NGlValue);//改变指针的值PVOIDInterlockedExchangePointer(PVOID*ppvTarget,PVOIDpvValue); 实现循环锁:可以用InterlockedExChange来实现循环锁的功能,所谓循环锁,就是在线程1中如果要对变量进行操作,要先查看这个变量(或资源)有没有被其它线程用到,如果是,则一直循环,则到其它线程放弃对该变量(或资源)的控制。如果否,直接可以对该变量(或资源)进行操作。如: BOOLg_fResourceInUse=FALSE;voidFunc1(){//Waittoaccesstheresour
4、ce.等待资源while(InterlockedExchange(&g_fResourceInUse,TRUE)==TRUE)Sleep(0);//Accesstheresource.//获取资源...////Wenolongerneedtoaccesstheresource.InterlockedExchange(&g_fResourceInUse,FALSE);//释放资源} 其它线程如要使用资源也如上代码所示。 OK,while循环是循环运行的(假使本线程是ThreadA),它将g_fResourceInUse中的值改为TRUE,并查看它的前一个值,以了解它是
5、否是TRUE。如果是,则表示已经有线程(假使为ThreadB)使用了,它就要等待,直到ThreadB线程执行InterLockedExchange(&g_fResourceInUse,FALSE);操作,则ThreadA它就可以退出while循环,然后获取资源,并且,它对g_fResourceInUse设置为TURE,其它线程(假使ThreadC)如要使用,则将如刚才ThreadA般等待。直到ThreadA的InterlockedExchange(&g_fResourceInUse,FALSE);执行完为止。 2.关键代码段 关键代码段是指这样一段代码,它可
6、以在代码执行前,独占对某资源的访问权。这是能让若干代码能够“以原子方式”来使用资源的另一种方法。注意,关键代码段运行中仍是可以被系统撤销它的时间片,再调度给别的线程。但是,可调度线程有了变化,访问该线程需要使用的资源的其它任何线程将得不到调度。关键代码段的使用:constintMAX_TIMES=1000;intg_nIndex=0;DWORDg_dwTimes[MAX_TIMES];CRITICAL_SECTIONg_cs; DWORDWINAPIFirstThread(PVOIDpvParam){while(g_nIndex7、iticalSection(&g_cs);g_dwTimes[g_nIndex]=GetTickCount();g_nIndex++;LeaveCriticalSection(&g_cs);}return(0);}DWORDWINAPISecondThread(PVOIDpvParam){while(g_nIndex
7、iticalSection(&g_cs);g_dwTimes[g_nIndex]=GetTickCount();g_nIndex++;LeaveCriticalSection(&g_cs);}return(0);}DWORDWINAPISecondThread(PVOIDpvParam){while(g_nIndex
此文档下载收益归作者所有