среда, 5 января 2011 г.

SRW locks

а вот например читаю я давеча Windows System Programming и вижу в главе 9 описание slim reader/writer locks:
SRW locks are light weight and small, the size of a pointer (either 32 or 64 bits). Also, there is no associated kernel object for waiting, thus SRW locks require minimal resources.
Звучит круто, но нужно проверить как оно сделано на самом деле.
Возьмем например функцию RtlAcquireSRWLockShared из ntdll.dll
и что мы там видим после кучи lock cmpxchg ? а видим мы там примерно следующее:

  push    0
  push    0
  lea     eax, [ebp+var_30]
  push    eax
  push    _GlobalKeyedEventHandle
  call    _NtWaitForKeyedEvent

т.е. если после некоторого числа неудачных попыток залочить ресурс (заданного в переменной SRWLockSpinCount и равного 0x400) все потоки, ожидающие srw locks, на самом деле отправляются в kernel, причем разделяют при этом одну единственную глобальную переменную GlobalKeyedEventHandle
Что характерно в msdn об этом тоже ни слова

Update: при дальнейшем изучении на более трезвую голову выяснились еще более интересные вещи - та же самая единственная глобальная переменная GlobalKeyedEventHandle используется еще и при реализации CriticalSection и ConditionVariableCS
Я чего-то слабо себе представляю как им удалось один объект синхронизации в куче совершенно разных мест использовать

Комментариев нет:

Отправить комментарий