Инициализируйте критический раздел только один раз для процесса - PullRequest
6 голосов
/ 07 апреля 2009

В многопоточном приложении есть способ гарантировать, что критический раздел инициализируется только один раз, за ​​исключением помещения кода в DLL main () ??

Ответы [ 5 ]

5 голосов
/ 09 апреля 2009

В Windows Vista вы можете использовать функции одноразовой инициализации. Использование одноразовой инициализации показывает, как их использовать, чтобы убедиться, что событие инициализируется только один раз.

3 голосов
/ 07 апреля 2009

Я бы предложил обернуть CRITICAL_SECTION классом, который будет обрабатывать инициализацию и неинициализацию объекта критического раздела в его конструкторе и деструкторе. Таким образом, в большинстве случаев вы будете потокобезопасны. (Вам нужно будет убедиться, что никто не получит доступ к объекту до завершения его конструктора, но это относительно просто.)

Существует несколько распространенных обёрток для CRITICAL_SECTION, которые вы можете использовать. MFC's CCriticalSection является очевидным выбором, но вы также можете создать свой собственный.

1 голос
/ 07 апреля 2009

Конечно, есть много способов.

  1. Использовать глобальную переменную
  2. Использовать одноэлементный экземпляр
  3. Создайте его в основной или какой-либо другой функции отдельного экземпляра
  4. Создайте его как член var некоторого экземпляра класса одного экземпляра

и так далее. Это ничем не отличается от любого другого вопроса о попытке создать отдельный экземпляр какой-либо вещи в вашем коде.

0 голосов
/ 15 апреля 2009

Вы можете инициализировать глобальный критический раздел в DllMain для DLL_PROCESS_ATTACH (и очистить для DLL_PROCESS_DETACH).

0 голосов
/ 07 апреля 2009

Вы также можете использовать класс-оболочку и объявить глобальный объект этого класса. Конструктор глобального объекта будет вызываться только один раз при запуске.

...