Ну и заодно добавим еще один метод в наш класс Clock
(листинг 15).
Листинг 15. Класс CLock с новым методом.
class CLock
{
friend class CScopeLock;
CRITICAL_SECTION m_CS;
public:
void Init() {
::InitializeCriticalSection(&m_CS); }
void Term() {
::DeleteCriticalSection(&m_CS); }
void Lock() {
::EnterCriticalSection(&m_CS); }
BOOL TryLock() { return
::TryEnterCriticalSection(&m_CS); }
void Unlock() {
::LeaveCriticalSection(&m_CS); }
BOOL Check() { return
CheckCriticalSection(&m_CS); }
};
|
Использовать метод Check() в release-конфигурациях не
стоит, возможно, что в будущем, в какой-нибудь Windows64, структура
RTL_CRITICAL_SECTION изменится, и результат такой проверки будет не определен.
Так что ему самое место "жить" внутри всяческих ASSERT'ов.
Итак, что мы имеем? Мы имеем проверку на лишний вызов
::LeaveCriticalSection() и ту же трассировку для блокировок. Не так уж много.
Особенно если трассировка о блокировке имеет место, а вот нить, забывшая
освободить критическую секцию, давно завершилась. Как быть? Вернее, что бы еще
придумать, чтобы ошибку проще было выявить? Как минимум, прикрутить сюда
__LINE__ и __FILE__, константы, соответствующие текущей строке и имени файла на
момент компиляции этого метода.
Рекомендуем скачать другие рефераты по теме: реферат на экономическую тему, инновационная деятельность.
Предыдущая страница реферата |
15
16
17
18
19
20
21
22
23
24
25 |
Следующая страница реферата