C++ 在函数和子函数中调用相同的临界段

C++ 在函数和子函数中调用相同的临界段,c++,multithreading,critical-section,C++,Multithreading,Critical Section,我是一名支持工程师,在一个失败的过程中,我发现有一些锁 使用Windbg(Visual Studio无法正确处理调用堆栈),我发现一个函数(ClassName::F())正在返回。该函数使用一个关键部分并调用一个子函数(ClassName::f_sub()),该子函数调用同一个关键部分,简而言之: int ClassName::f_sub(){ EnterCriticalSection(&m_cs); ... LeaveCriticalSection(&m_cs);

我是一名支持工程师,在一个失败的过程中,我发现有一些锁

使用Windbg(Visual Studio无法正确处理调用堆栈),我发现一个函数(
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().
我的分析正确吗?这是否意味着建议为主要功能和子功能设置不同的关键部分

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

来自(我的):

在线程拥有关键部分的所有权之后,它可以 对EnterCriticalSection或TryEnterCriticalSection的其他调用 不妨碍它的执行。这可以防止线程丢失 在等待一个关键部分时死锁 已经拥有了。每次线程都会进入临界段 EnterCriticalSection和TryEnterCriticalSection成功一根线 必须在每次进入时调用LeaveCriticalSection一次 临界截面。

所以不,你所描述的不应该发生。多次进入critical section是完全可以的,并且需要多次离开它。

另请参阅推荐阅读:Re,“…[同一线程]可以对EnterCriticalSection进行其他调用…”有一个名称。它通常被称为