Windows核心编程之线程同步

Windows核心编程之线程同步

ID:41032599

大小:80.50 KB

页数:7页

时间:2019-08-14

Windows核心编程之线程同步_第1页
Windows核心编程之线程同步_第2页
Windows核心编程之线程同步_第3页
Windows核心编程之线程同步_第4页
Windows核心编程之线程同步_第5页
资源描述:

《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_nIndex

7、iticalSection(&g_cs);g_dwTimes[g_nIndex]=GetTickCount();g_nIndex++;LeaveCriticalSection(&g_cs);}return(0);}DWORDWINAPISecondThread(PVOIDpvParam){while(g_nIndex

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。