这只是我的代码的一小部分:
CRITICAL_SECTION _cs;
InitializeCriticalSection(&_cs);
void lock() {
if (_initizalized){
EnterCriticalSection(&_cs);
EnterCriticalSection(&_cs);
_locked = true;
}
}
(我写了两次“EnterCriticalSection”,因为我注意到这行不起作用) 据我了解,这必然会造成僵局。但事实并非如此。为什么呢?
答案 0 :(得分:9)
没有相同的线程可以随意输入它。 CRITICAL_SECTION用于限制多个不同线程之间的访问。
答案 1 :(得分:7)
EnterCriticalSection允许来自同一线程的递归调用。来自文档:
在线程拥有关键部分的所有权后,它就可以生成 对EnterCriticalSection或TryEnterCriticalSection的额外调用 没有阻止它的执行。这可以防止线程 在等待关键部分时它会自行死锁 已经拥有。线程每次都进入临界区 EnterCriticalSection和TryEnterCriticalSection成功。一个帖子 必须在每次进入时调用LeaveCriticalSection一次 关键部分。
答案 2 :(得分:3)
作为MSDN says,
在线程拥有关键部分的所有权后,可以在不阻止其执行的情况下对EnterCriticalSection或TryEnterCriticalSection进行额外调用。这可以防止线程在等待它已经拥有的关键部分时自行死锁。每次EnterCriticalSection和TryEnterCriticalSection成功时,线程都会进入临界区。每次进入临界区时,线程必须调用一次LeaveCriticalSection。