| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Critical_Section и Mutex |
| Автор: 0xDX 6.2.2009, 06:41 | ||||||||||||
| CRITICAL_SECTION - Создаём критическую секцию:
Поля структуры CRITICAL_SECTION
InitializeCriticalSection Зануляет параметры LockCount - равен -1 указывает что критическая секция свободна RecursionCount; OwningThread; - равен ноль. это хендл на поток который захватил критическую секцию. LockSemaphore; SpinCount; Также выделяет память на DebugInfo - это еще одна структура. Теперь делаем блокировку на первой нити EnterCriticalSection(&critical_section); Код(интересующая нас часть)
Вовторой нити делаем этой же структере critical_section то же EnterCriticalSection Что получается
В нашел случае перехоод был на
Это код при востановлении потока от блокировки, делает захват киртической секции для текущего потока.
Вызов 7C91B19F очень большой что бы его описывать, по сути дело там делается sysenter(переход в режим ядра) Теперь LeaveCriticalSection mov dword ptr [edx+0Ch],eax; зануляет хендл владельца (хендл потока) lock dec dword ptr [edx+4] - уменьшает LockCount(атомарная операция) jge 7C9010F7 - если не LockCount 0 то делает переход на Наш переход: push edx ; call 7C91B267 ; Это был вызов 7C91B267 с передачай структурой , где произойдет sysenter Вывод: Критические секции делают sysenter когда это действительно нужно, то и есть блокировать поток или разблокировать. Mutex Я не стал их расписывать долго(так как придется скорее всего в ядро лесть), вообщем в кратции. CreateMutex - sysenter OpenMutex - sysenter ReleaseMutex - sysenter WaitFor*Object* - sysenter Вывод всегда делаю sysenter. Может чего не так поправьте. Просто делать было не чего, ночь спать не хочется. А тут вспомнил наболевшую тему про то что критические секции не используют ядро(переход в режим ядра) или используют, кто то говорил что косвенно...... |