Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Critical_Section и Mutex, синхронизация потоков 
:(
    Опции темы
0xDX
Дата 6.2.2009, 06:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 6.2.2009

Репутация: нет
Всего: нет



CRITICAL_SECTION  - 

Создаём критическую секцию:
    
Код

CRITICAL_SECTION critical_section;
    InitializeCriticalSection(&critical_section);


Поля структуры CRITICAL_SECTION
Код

PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
    LONG LockCount;
    LONG RecursionCount;
    HANDLE OwningThread;        
    HANDLE LockSemaphore;
    ULONG_PTR SpinCount;  


InitializeCriticalSection
Зануляет параметры
LockCount - равен -1 указывает что критическая секция свободна
RecursionCount;
OwningThread; - равен ноль. это хендл на поток который захватил критическую секцию.
     LockSemaphore;
     SpinCount;  

Также выделяет память на  DebugInfo - это еще одна структура.


Теперь делаем блокировку на первой нити
    EnterCriticalSection(&critical_section);
Код(интересующая нас часть)    
    
Код

  cmp         dword ptr [edx+14h],0 ; SpinCount проверка на ноль
      jne         7C901060 
      lock inc    dword ptr [edx+4]   ;атомарная операции  ++LockCount
      jne         7C901030; LockCount>0 делаент переход 
      mov         eax,dword ptr [ecx+24h]  ; вычесляет хендл потока регистр ecx был получен   mov  ecx,dword ptr fs:[18h] 
      mov         dword ptr [edx+0Ch],eax  ; записывает в OwningThread хендл
      mov         dword ptr [edx+8],1      ;RecursionCount = 1
      xor         eax,eax   ;ВЫХОД
      ret         4         ;ВЫХОД

    
Вовторой нити делаем этой же структере critical_section то же EnterCriticalSection
Что получается

Код

lock inc    dword ptr [edx+4]   ;атомарная операции  ++LockCount
 jne         7C901030; LockCount>0 делает переход происходит переход   7C901030
  mov         eax,dword ptr [ecx+24h] ; вычесляет хендл текущего потока регистр
  cmp         dword ptr [edx+0Ch],eax ; сравнение с хендл из структуры critical_section
  jne         7C901040 
  inc         dword ptr [edx+8] ; увеличит RecursionCount
  Выход


В нашел случае перехоод был на 

 
Код

 push        edx  
  call        7C91B19F ; здесь будет блокировка


Это код при востановлении потока от блокировки, делает захват киртической секции для текущего потока.
  
Код

mov         ecx,dword ptr fs:[18h] 
  mov         edx,dword ptr [esp+4] 
  jmp         7C901017 
  lea         esp,[esp] 
  lea         ebx,[ebx] 
  mov         eax,dword ptr [ecx+24h] 
  cmp         dword ptr [edx+0Ch],eax 
  jne         7C901080 
  lock inc    dword ptr [edx+4] 
  inc         dword ptr [edx+8] 
  xor         eax,eax 
  ret         4    
  lea         esp,[esp] 


Вызов 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.


Может чего не так поправьте. Просто делать было не чего, ночь спать не хочется. А тут вспомнил наболевшую тему про то что критические секции не используют ядро(переход в режим ядра) или используют, кто то говорил что косвенно......













PM MAIL   Вверх
Lazin
Дата 6.2.2009, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 8
Всего: 154



Цитата(0xDX @  6.2.2009,  06:41 Найти цитируемый пост)
Вывод: Критические секции делают sysenter когда это действительно нужно, то и есть блокировать поток или разблокировать.

это есть в MSDN smile
кстати можно установить Spin count, тогда системный вызов произойдет не сразу а только после того как счетчик обнулится, но в целом все правильно
PM MAIL Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0424 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.