19.04.2007 0:11:24Многопоточность и секретный ключ. Ответов: 1
Антон Чикин
В многопоточном приложении имею следующий эффект.
Если создать HCRYPTPROV с помощью CryptAcquireContext, а затем использовать данный контекст в нескольких нитях одновременно и выполнять операции требующие обращения к закрытому ключу (CryptSignHash или CryptSignMessage) то вне зависимости от числа нитей, которые будут пытаться вычислять подпись, одновременно обращаться к ключу может только одна нить. То есть, на машине с HyperThreading вы получите только 50% загрузки процессора! Такое ощущение, что нить блокирует закрытый ключ (или контекст криптопровайдера) для привелигерованного доступа. Если создать несколько HCRYPTPROV (по количеству нитей), тогда все нормально : нити друг друга не блокируют.

Вопрос в том, можно ли использовать HCRYPTPROV в нескольких нитях и избежать блокировки? Не очень хочется создавать HCRYPTPROV на каждую нить.
 
Ответы:
19.04.2007 13:08:01Василий
Обращение к ключу (в рамках конкретного контекста контейнера) происходит под блокировкой. Это сделано специально. Собственно, по-другому быть не может - иначе можно нарушить целостность.

Если нужно несколько контекстов одного контейнера - то можно открыть контекст ф-ей CryptAcquireContext в одной нитке, а в других использовать CryptContextAddRef и в конце работы каждой нитки с контейнером вызывать CryptReleaseContext