Galkov писал(а):
Критические секции в твоем исполнении не могут выполнить задачу зашиты ресурса, даже теоретически, УЖЕ ТОЛЬКО ПОТОМУ - что не используется св-во Name
Ссылку на букварь, где написано, что структура TRTLCriticalSection должна нести в себе имя Name
Не постесняюсь привести Рихтера. Ткни пальцем, где там написано, что секция должна иметь уникальное имя.
Рихтер писал(а):
Теперь, когда у Вас появилось общее представление о критических секциях (зачем они нужны и как с их помощью можно монопольно распоряжаться разделяемым ресурсом), давайте повнимательнее приглядимся к тому, как они устроены. Начнем со структуры CRITICAL_SECTION. Вы не найдете ее в Platform SDK — о ней нет даже упоминания. В чем дело?
Хотя CRITICAL_SECTION не относится к недокументированным структурам, Microsoft полагает, что Вам незачем знать, как она устроена. И это правильно. Для нас она является своего рода черным ящиком - сама структура известна, а ее элементы — нет. Конечно, поскольку CRITICAL_SECTION — не более чем одна из структур, мы можем сказать, из чего она состоит, изучив заголовочные файлы. (CRITICATL_SECTlON определена в файле WinNT.h как RTL_CRITICAL_SECTION, а тип структуры RTL_CRITICAL_SECTION определен в файле WinBase.h,)
Но никогда не пишите код, прямо ссылающийся на ее элементы.
Вы работаете со структурой CRITICAL_SECTION исключительно через функции Windows, передавая им адрес соответствующего экземпляра этой структуры Функции сами знают, как обращаться с ее элементами, и гарантируют, что она всегда будет в согласованном состоянии. Так что теперь мы перейдем к рассмотрению этих функций.
Обычно структуры CRITICAL_SECTION создаются как глобальные переменные, доступные всем потокам процесса. Но ничто не мешает нам создавать их как локальные переменные или переменные, динамически размещаемые в куче. Есть только два условия, которые надо соблюдать. Во-первых, все потоки, которым может понадобиться ресурс, должны знать адрес структуры CRITICAL_SECTION, которая защищает этот ресурс. Вы можете получить ее адрес, используя любой из существующих механизмов. Во-вторых, элементы структуры CRITICAL_SECTION следует инициализировать до обращения какого-либо потока к защищенному ресурсу. Структура инициализируется ВЫЗОВОМ:
VOID InitializeCriticalSection(PCRITICAL_SECTION pcs);
Эта функция инициализирует элементы структуры CRITICAL_SECTION, на которую указывает параметр pcs. Поскольку вся работа данной функции заключается в инициализации нескольких переменных-членов, она не дает сбоев и поэтому ничего не возвращает (void). InitializeCriticalSection должна быть вызвана до того, как один из потоков обратится к EnterCriticalSection. В документации Platform SDK недвусмысленно сказано, что попытка воспользоваться неинициализированной критической секцией даст непредсказуемые результаты
Ясно и конкретно написано, что трогать структуру нельзя, этим занимается специальная функция.
Если речь не об этом, тогда просьба уточнить, что имелось в виду под словом Name
Galkov писал(а):
хотя там тоже смешно
В чем конкретно наблюдается "смешная реализация"
------------ Дoбавленo в 02.31:
Может возникнуть тычек пальцем в спин блокировку, но тут читаем опять Рихтера
Рихтер писал(а):
На мой взгляд, используя критические секции, Вы
должны всегда применять спин-блокировку — терять Вам просто нечего. Moгут возникнуть трудности в подборе значения dwSpinCount, но здесь нужно просто поэкспериментировать