![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| 0xDX |
|
||||||||||||
|
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 6.2.2009 Репутация: нет Всего: нет |
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. Может чего не так поправьте. Просто делать было не чего, ночь спать не хочется. А тут вспомнил наболевшую тему про то что критические секции не используют ядро(переход в режим ядра) или используют, кто то говорил что косвенно...... |
||||||||||||
|
|||||||||||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 8 Всего: 154 |
это есть в MSDN кстати можно установить Spin count, тогда системный вызов произойдет не сразу а только после того как счетчик обнулится, но в целом все правильно |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |