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(); 写代码的时候一定要细心,不管手头的活再多,脑残策划吹的再急,也要稳一点。

  • 相关阅读:
    洛谷 2846 (线段树)
    Conclusion
    codevs 2495 水叮当的舞步IDA*
    1247 排排站 USACO(查分+hash)
    洛谷 1373 小a和uim之大逃离
    noip 2012 疫情控制
    poj 1780 code(欧拉路)
    uva 1391 Astronauts(2-SAT)
    uva 1146 Now or late (暴力2-SAT)
    uva 11324 The Largest Clique (Tarjan+记忆化)
  • 原文地址:https://www.cnblogs.com/kupig/p/2083170.html
Copyright © 2011-2022 走看看