Сколько CRITICAL_SECTIONs я могу создать?

Это смутило меня. Все еще не уверен, что я обращаюсь с этим правильно. Запустите \h grant для синтаксиса в psql. Вот как мне удалось заставить других моих пользователей и группы работать так, как мне нужно:

GRANT ALL PRIVILEGES ON SCHEMA foo TO GROUP bar;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA foo TO GROUP bar;
9
задан sashoalm 28 January 2013 в 14:28
поделиться

3 ответа

Если вы внимательно прочитаете документацию для IntializeCriticalSectionWithSpinCount () , станет ясно, что каждая критическая секция поддерживается объектом Event, хотя API для критических секций рассматривает их как непрозрачные структуры. Кроме того, комментарий «Windows 2000» к параметру dwSpinCount указывает, что объект события «выделяется по запросу».

Я не знаю какой-либо документации, в которой говорится, какие условия удовлетворяют «по запросу», но я подозреваю, что это не создается, пока поток не блокируется при входе в критическую секцию. Для критических секций с подсчетом спинов это может не произойти до тех пор, пока время ожидания спина не будет исчерпано.

С эмпирической точки зрения я работал над приложением, которое, как мне известно, создало не менее 60 000 живых COM-объектов, каждый из которых синхронизируется со своим собственным CRITICAL_SECTION. Я никогда не видел ошибок, свидетельствовавших о том, что я исчерпал запас объектов ядра.

7
ответ дан 4 December 2019 в 13:04
поделиться

Нет ограничений на количество CRITICAL_SECTION структур , которые вы можете объявить - они просто структуры данных POD на самом низком уровне. Может быть некоторое ограничение на количество, которое вы можете инициализировать с помощью InitializeCriticalSection () . Согласно документации, это может вызвать исключение STATUS_NO_MEMORY в Windows 2000 / XP / Server 2003, но, очевидно, это гарантированно будет успешным в Vista. Они не занимают никаких ресурсов ядра до тех пор, пока вы их не инициализируете (если они вообще потребуют).

Если вы обнаружите, что возникает исключение STATUS_NO_MEMORY , вы можете попробовать инициализировать только CRITICAL_SECTION для данного объекта, если есть шанс, что он может быть использован в нескольких потоках.

9
ответ дан 4 December 2019 в 13:04
поделиться

Большинство типов дескрипторов / ресурсов в Windows ограничены памятью или maxint, что бы ни было первым. (Теоретически на 64-битном maxint может случиться, я полагаю.)

Иногда унылые тексты, которые вы найдете на эту тему, обычно актуальны только для Win9x, у которой были некоторые ограничения. (Всего 64k объектов ядра)

0
ответ дан 4 December 2019 в 13:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: