zoukankan      html  css  js  c++  java
  • 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

     


  • 相关阅读:
    瑞游天翼客户端win7,win8,win10
    js循环POST提交添加辅助单位
    服务器状态检测(1)
    快速切换天财商龙门店后台.VB6.0
    大批量删除农行点菜宝菜品品相和房间
    社会工程学
    你还会记得吗
    优酷爆个人数据漏洞
    win8删除无线网络其中的一项配置
    穿越火线修改成宽屏模式
  • 原文地址:https://www.cnblogs.com/fangyukuan/p/1816256.html
Copyright © 2011-2022 走看看