Отладка критических секций
Весьма интересное и увлекательное занятие. Можно
потратить часы и недели, но так и не найти, где именно возникает проблема.
Стоит уделить этому особо пристальное внимание. Ошибки, связанные с
критическими секциями, бывают двух типов: ошибки реализации и архитектурные
ошибки.
Ошибки, связанные с реализацией
Это довольно легко обнаруживаемые ошибки, как правило, связанные с непарностью вызовов ::EnterCriticalSection() и
::LeaveCriticalSection().
Листинг
8. Пропущен вызов ::EnterCriticalSection().
// Процедура предполагает, что
m_lockObject.Lock(); уже был вызван
void
Pool()
{
for (int i = 0; i < m_vectSinks.size();
i++)
{
m_lockObject.Unlock();
m_vectSinks[i]->DoSomething();
m_lockObject.Lock();
}
}
|
::LeaveCriticalSection() без ::EnterCriticalSection()
приведет к тому, что первый же вызов ::EnterCriticalSection() остановит
выполнение нити навсегда.
Листинг
9. Пропущен вызов ::LeaveCriticalSection().