代码之家  ›  专栏  ›  技术社区  ›  Dominique

在函数和子函数中调用相同的关键部分

  •  0
  • Dominique  · 技术社区  · 7 年前

    我是一名支持工程师,在一个失败进程的转储中,我看到有一些锁。

    ClassName::F() )回来了。该函数使用关键部分并调用子函数( ClassName::f_sub() ),他在说同样的关键部分,简而言之:

    int ClassName::f_sub(){
      EnterCriticalSection(&m_cs);
      ...
      LeaveCriticalSection(&m_cs);
      return ...;
    }
    
    int ClassName::F() {
      EnterCriticalSection(&m_cs);
      ...
      int temp = f_sub();
      ...
      LeaveCriticalSection(&m_cs);
      return ...;
    }
    

    每次都是同样的关键部分 m_cs (财产 ClassName

    在我看来,这使得以下顺序成为可能:

    Thread 1 : F()     : Enter the critical section. (Thread 1 is in)
    Thread 1 : f_sub() : Enter the critical section. (Thread 1 is in)
    Thread 1 : f_sub() : Leave the critical section. (Thread 1 is out)
    Thread 2 : F()     : Enter the critical section. (Thread 2 is in) 
    
    => WRONG! Thread 2 should be forced to wait for Thread 1 leaving the critical section via F().
    

    我的分析正确吗?这是否意味着建议主功能和子功能有不同的关键部分?

    0 回复  |  直到 7 年前
        1
  •  1
  •   tkausl    7 年前

    我的分析正确吗?这是否意味着建议主功能和子功能有不同的关键部分?

    Microsoft Docs (强调我的):

    在线程拥有关键部分的所有权之后,它可以 对EnterCriticalSection或TryEnterCriticalSection的其他调用 不妨碍它的执行。这样可以防止线程 已经拥有了。每次线程都进入临界区 EnterCriticalSection和TryEnterCriticalSection成功。 线 每次进入 关键部分。