嵌套关键部分是否有效?

Jim*_*ell 17 c++ winapi critical-section

例如,这是否有效?

CRITICAL_SECTION cs;

::InitializeCriticalSection( &cs );

::EnterCriticalSection( &cs );      // First level
::EnterCriticalSection( &cs );        // Second level

/* do some stuff */

::LeaveCriticalSection( &cs );        // Second level
::LeaveCriticalSection( &cs );      // First level

::DeleteCriticalSection( &cs );
Run Code Online (Sandbox Code Playgroud)

显然,我永远不会故意这样做,但是如果由于函数调用而产生这样的结果,那么"第一级"被调用来锁定对象以进行复杂(例如搜索)算法和"第二级"在该对象的访问器函数中被调用?

R. *_*des 31

是的,在其内部输入相同的关键部分是有效的.来自文档:

在线程拥有关键部分的所有权后,它可以对EnterCriticalSection或TryEnterCriticalSection进行额外调用,而不会阻止其执行.这可以防止线程在等待它已经拥有的关键部分时自行死锁.每次EnterCriticalSection和TryEnterCriticalSection成功时,线程都会进入临界区.每次进入临界区时,线程必须调用一次LeaveCriticalSection.

  • @Remy:不,它不适用于所有其他类型的同步对象。您当然可以拥有不可重入的互斥体。 (2认同)

Che*_*eso 10

文档:

在线程拥有关键部分的所有权后,它可以对EnterCriticalSection或TryEnterCriticalSection进行额外调用,而不会阻止其执行.这可以防止线程在等待它已经拥有的关键部分时自行死锁.每次EnterCriticalSection和TryEnterCriticalSection成功时,线程都会进入临界区.每次进入临界区时,线程必须调用一次LeaveCriticalSection.