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
Я чего-то слабо себе представляю как им удалось один объект синхронизации в куче совершенно разных мест использовать
Комментариев нет:
Отправить комментарий