У меня есть проблема с безопасностью исключения в функции InitOnceExecuteOnce WinAPI. Всякий раз, когда исключение выбрасывается из функции обратного вызова, происходит взаимоблокировка. Обратный вызов возвращает флаг boolean, указывающий вызывающему, успешно ли инициализированы данные, но если я вернусь к false, я не смогу исключить исключение, это не хорошо. Я попытался решить проблему таким образом.InitOnceExecuteOnce безопасность исключений
try
{
InitOnceExecuteOnce(&flag, init_once_handler, &arguments, 0);
} catch (...)
{
InitOnceInitialize(&flag);
throw;
}
Всякий раз, когда я ловлю исключение из функции я INIT структуры еще раз и Rethrow исключения, так что другие потоки будут найти данные не инициализированы, так как флаг находится в исходном состоянии. Тем не менее, он иногда также блокируется, возможно, потому, что другой поток начал ждать объекта синхронизации до того, как первый снова поймал исключение и инициализировал флаг. Есть ли решение этой проблемы?
Заранее спасибо.
Это пользовательская функция, я не могу дать эту гарантию. Это код на C++, который использует контейнеры, алгоритмы, и на каждом шаге могут быть исключения, я должен избегать проблем в результате выполнения этой функции, а также хотел бы распространять исключение на вызывающего, но это вызывает тупик. Может быть, есть еще один механизм, который позволяет это? – axe
@axe: Если это так, оберните этот обратный вызов своим собственным, ваш обратный вызов поймает исключение и вернет false. вы можете опционально обернуть аргумент функции в структуру, что позволит вам вернуть информацию об исключении из обратного вызова. – Hasturkun
Я уже сделал это, я также обернул объект исключения с классом polymorph, который вызывает исключение (что-то вроде boost :: current_exception), однако это позволяет мне переустановить только предопределенный набор исключений, если пользователь бросает какой-то пользовательский объект класса он поймает std :: runtime_error («неизвестное исключение»). Достаточно хорошо, но может быть лучше. – axe