Критические секции
Категория реферата: Рефераты по информатике, программированию
Теги реферата: бесплатно решебник, рефераты на украинском языке
Добавил(а) на сайт: Сыровой.
Предыдущая страница реферата | 16 17 18 19 20 21 22 23 24 25 26 | Следующая страница реферата
VOID EnterCriticalSectionDbg(LPCRITICAL_SECTION pcs , int nLine = __LINE__, azFile = __FILE__); |
Компилируем, запускаем... Результат удивительный. Хотя правильный. Компилятор честно подставил номер строки и имя файла, соответствующие началу нашей EnterCriticalSectionDbg(). Так что придется попотеть немного больше. __LINE__ и __FILE__ нужно вставить в #define'ы, тогда мы получим действительные номер строки и имя исходного файла. Теперь вопрос, куда же сохранить эти параметры для дальнейшего использования? Причем хочется оставить за собой возможность вызова стандартных функций API наряду с нашими собственными? На помощь приходит C++: просто создадим свою структуру, унаследовав ее от RTL_CRITICAL_SECTION (листинг 16).
Листинг 16. Реализация критических секций с сохранением строки и имени файла.
#if defined(_DEBUG) && !defined(_NO_DEADLOCK_TRACE) #define DEADLOCK_TIMEOUT 30000 #define CS_DEBUG 2 // Наша структура взамен CRITICAL_SECTION struct CRITICAL_SECTION_DBG : public CRITICAL_SECTION { // Добавочные поля int m_nLine; LPCSTR m_azFile; }; typedef struct CRITICAL_SECTION_DBG *LPCRITICAL_SECTION_DBG; // Создаем на лету событие для операций ожидания, // но никогда его не освобождаем. Так удобней для отладки. static inline HANDLE _CriticalSectionGetEvent(LPCRITICAL_SECTION pcs) { HANDLE ret = pcs->LockSemaphore; if (!ret) { HANDLE sem = ::CreateEvent(NULL, false, false, NULL); ATLASSERT(sem); if (!(ret = (HANDLE)::InterlockedCompareExchangePointer( &pcs->LockSemaphore, sem, NULL))) ret = sem; else ::CloseHandle(sem); // Кто-то успел раньше } return ret; } // Ждем, пока критическая секция не освободится либо время ожидания // будет превышено static inline VOID _WaitForCriticalSectionDbg(LPCRITICAL_SECTION_DBG pcs , int nLine, LPCSTR azFile) { HANDLE sem = _CriticalSectionGetEvent(pcs); DWORD dwWait; do { dwWait = ::WaitForSingleObject(sem, DEADLOCK_TIMEOUT); if (WAIT_TIMEOUT == dwWait) { ATLTRACE("Critical section timeout (%u msec):" " tid 0x%04X owner tid 0x%04Xn" "Owner lock from %hs line %u, waiter %hs line %un" , DEADLOCK_TIMEOUT , ::GetCurrentThreadId(), pcs->OwningThread , pcs->m_azFile, pcs->m_nLine, azFile, nLine); Рекомендуем скачать другие рефераты по теме: реферат на экономическую тему, инновационная деятельность. Предыдущая страница реферата | 16 17 18 19 20 21 22 23 24 25 26 | Следующая страница реферата Поделитесь этой записью или добавьте в закладкиКатегории: |