zoukankan      html  css  js  c++  java
  • 临界区

    下面我就用Lock, Unlock分别代替EnterCriticalSection(),LeaveCriticalSection()吧. 这样说起来方便.

    // 线程1
    threadfunc1()
    {
      Lock();
      // 代码1
      Unlock();
    }

    // 线程2
    threadfunc2()
    {
      Lock();
      // 代码2
      Unlock();
    }

    当 线程1 执行了 代码1 时,先Lock(); 这时如果 线程2 被唤醒, 遇到Lock()的时候会根据 CRITICAL_SECTION cs 来是否可以使用 代码2。因 cs 已经被 线程1 所占领。所以第二个线程的Lock()语句将不会返回,而是处于挂起状态,直到第一个线程执行了Unlock(), 第二个线程的Lock()语句才会返回并且继续执行下面的操作。

    虽然临界区同步速度很快,但只能用来同步本进程内的线程,而不可用来同步多个进程中的线程

    简单地说,对于同一个 CRITICAL_SECTION,当一个线程执行了EnterCriticalSection而没有执行LeaveCriticalSection的时候,其它任何一个线程都无法完全执行EnterCriticalSection而不得不处于等待状态

    我今天就犯了个严重的错误,代码段如下:

    void CDataMngr::AddData(unsigned int uData)
    {
    Lock();
    if ( uData > 0 ){
    return;
    }
    Unlock();
    }

    看出错误来了吧。在return 之前应该有Unlock(); 写代码的时候一定要细心,不管手头的活再多,脑残策划吹的再急,也要稳一点。

  • 相关阅读:
    UPC12617 卡片
    mcmf的dijkstra板子(来自PHY学长)
    UPC9630 Mad Veterinarian
    UPC8173【 哈希和哈希表】Three Friends
    UPC9655 Plug It In!
    UPC8428 网格VI
    UPC4248【数论】数字迷阵
    UPC4247【数论】普通递归关系
    SPOJ
    hdu 5992 Finding Hotels (kdTree)
  • 原文地址:https://www.cnblogs.com/kupig/p/2083170.html
Copyright © 2011-2022 走看看