这只是我代码的一小部分:
CRITICAL_SECTION _cs;
InitializeCriticalSection(&_cs);
void lock() {
if (_initizalized){
EnterCriticalSection(&_cs);
EnterCriticalSection(&_cs);
_locked = true;
}
}
Run Code Online (Sandbox Code Playgroud)
(我写了两次"EnterCriticalSection",因为我注意到这行不起作用)据我所知,这必然会导致死锁.但事实并非如此.为什么?
EnterCriticalSection允许来自同一线程的递归调用.从文档:
在线程拥有关键部分的所有权后,它可以对EnterCriticalSection或TryEnterCriticalSection进行额外调用,而不会阻止其执行.这可以防止线程在等待它已经拥有的关键部分时自行死锁.每次EnterCriticalSection和TryEnterCriticalSection成功时,线程都会进入临界区.每次进入临界区时,线程必须调用一次LeaveCriticalSection.
| 归档时间: |
|
| 查看次数: |
5243 次 |
| 最近记录: |