C++ 在函数和子函数中调用相同的临界段
我是一名支持工程师,在一个失败的过程中,我发现有一些锁 使用Windbg(Visual Studio无法正确处理调用堆栈),我发现一个函数(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);
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进行其他调用…”有一个名称。它通常被称为