windows笔记-【用户方式线程同步】关键代码段

关键代码段是指一个小代码段,在代码能够执行前,它必须独占对某些共享资源的访问权

下面是个有问题的代码,它显示了不使用关键代码段会发生什么情况:

const int MAX_TIMES = 1000;

int   g_nIndex = 0;

DWORD g_dwTimes[MAX_TIMES];

 

DWORD WINAPI FirstThread(PVOID pvParam)

{

   while(g_nIndex < MAX_TIMES)

   {

      g_dwTimes[g_nIndex] = GetTickCount();

      g_nIndex++;

   }

   return(0);

}

 

 

DWORD WINAPI SecondThread(PVOID pvParam)

{

   while(g_nIndex < MAX_TIMES)

   {

      g_nIndex++;

      g_dwTimes[g_nIndex - 1] = GetTickCount();

   }

   return(0);

}

上面的代码存在一个问题,那就是g_dwTimes不会被正确地填入数据,因为两个线程函数要同时访问相同的全局变量。

const int MAX_TIMES = 1000;

int   g_nIndex = 0;

DWORD g_dwTimes[MAX_TIMES];

CRITICAL_SECTION g_cs;

 

DWORD WINAPI FirstThread(PVOID pvParam)

{

   while(g_nIndex < MAX_TIMES)

   {

      EnterCriticalSection(&g_cs);

      g_dwTimes[g_nIndex] = GetTickCount();

      g_nIndex++;

      LeaveCriticalSection(&g_cs);

   }

   return(0);

}

 

 

DWORD WINAPI SecondThread(PVOID pvParam)

{

   while(g_nIndex < MAX_TIMES)

   {

      EnterCriticalSection(&g_cs);

      g_nIndex++;

      g_dwTimes[g_nIndex - 1] = GetTickCount();

      LeaveCriticalSection(&g_cs);

   }

   return(0);

}

这里指定了一个CRITICAL_SECTION数据结构g_cs,然后在对EnterCriticalSectionLea veCriticalSection函数调用中封装了要接触共享资源(在这个例子中为g_nIndexg_dwTimes)的任何代码。

 

注意:编写的需要使用共享资源的任何代码都必须封装在EnterCriticalSectionLeaveCriticalSection函数中。

 

当无法用互锁函数来解决同步问题时,你应该试用关键代码段。

 

关键代码段的优点

它们的使用非常容易,它们在内部使用互锁函数,这样它们就能够迅速运行。

关键代码的主要缺点

无法用它们对多个进程中的各个线程进行同步。

本文地址:http://www.cnblogs.com/fangyukuan/archive/2010/09/02/1816256.html

 


转载于:https://www.cnblogs.com/fangyukuan/archive/2010/09/02/1816256.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值