1 / 4
文档名称:

WINDOWS下线程同步探讨.pdf

格式:pdf   页数:4
下载后只包含 1 个 PDF 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

WINDOWS下线程同步探讨.pdf

上传人:紫岑旖旎 2012/9/16 文件大小:0 KB

下载得到文件列表

WINDOWS下线程同步探讨.pdf

文档介绍

文档介绍:踏雪无痕
WINDOWS下线程同步探讨
分类: 技术摘录 2011-11-04 11:44 173人阅读评论(0) 收藏举报
概述
线程同步可以采用多种方式。可以在用户方式下实现,也可以在内核方式下实现。前者的优势在于速度快,因为不
用在用户方式和内核方式之间切换,但只能用于同一个进程内的线程之间的同步;后者是使用内核对象的方式,速
度虽慢,但可以用于不同进程之间的线程同步。而且后者相对前者方法丰富许多,功能也强大许多。
用户方式下的线程同步
互锁函数组
      下列函数可以以原子的方式进行操作(即或者全做,或者全不做,而且做得过程中不会被打断):
      InterlockedExchangeAdd:原子方式增加一个变量,可以在参数中提供负值来实现原子减法操作。
      InterlockedExchange,InterlockedExchangePointer:实现原子赋值操作,而且返回原始数值。
      pareExchange,pareExchangePointer:原子方式比较赋值,即如果目标变量
和被比较值相等时,目标变量才会被赋值为原始值。
      所有的互锁函数都是跟写变量相关的,没有读变量的互锁函数。因为读变量不会产生同步问题。引申出来,
也没有比较两个变量是否相等的互锁函数,因为只是读变量,而不会写变量。所以下文的循环锁中的相等判断就不
会产生同步问题。
循环锁
      循环锁是利用互锁函数族中的InterlockedExchange来实现的一种线程同步方式。参考下面的代码:
      BOOL g_bResourceInUse = FALSE;
      void func()
{
      //wait to access the resource
      while (InterlockedExchange(&g_bResourceInUse, TRUE) == TRUE)
      {
           Sleep(0);
      }
 
      //access the resource
      …
 
      //no longer need to access the resource
      InterlockedExchange(&g_bResourceInUse, FALSE);
}   
说明:
Sleep(0)是告诉系统该线程将释放剩余的时间片,并迫使系统调度另外一个线程。主要是因为下面:
while (InterlockedExchange(&g_bResourceInUse, TRUE) == TRUE)
1
{
      Sleep(0);
}
开始g_bResourceInUse(简称布尔量)为FALSE,如果两个线程都运行这段代码,第一个会比较布尔量和TRUE,因为
布尔量是FALSE,所以布尔量被赋值为FALSE,并且返回TRUE,进入关键区;另一个线程则总是返回TRUE,所以循环
直到第一个线程退出关键区重新把布尔量赋为FALSE为止。
如果等待时间很短,这种方式是相当快的。比下面的关键代码段都要快,