Вопрос

У меня есть проблема безопасности исключений на функции initonceexecateonce winapi. Всякий раз, когда происходит исключение из обратного вызова тупика. Callback возвращает логический флаг, рассказывающий об абоненте, успешно ли инициализированные данные, но если я вернусь false, я не смогу переосмыслить исключение, это нехорошо. Я попытался решить проблему таким образом.

try
{
    InitOnceExecuteOnce(&flag, init_once_handler, &arguments, 0);
} catch (...)
{
    InitOnceInitialize(&flag);
    throw;
}

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

Заранее спасибо.

Это было полезно?

Решение

Вы не должны бросать исключения C ++ через код, который не ожидает его (например, C -код или в вашем случае, API Windows). Вместо этого дайте ваш обратный вызов вернуть false на ошибку, которая будет отражена в возврате из InitOnceExecuteOnce

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top