2012-02-01 2 views
3

В многопоточном приложении я использую следующий макрос ASSERT для обнаружения ошибок кодирования и данных во время тестирования модуля отладки.Как изящно выйти из отказа утверждения в многопоточном приложении

#ifndef NDEBUG 
#define ASSERT(condition, message) \ 
do { \ 
    if (! (condition)) { \ 
     std::cerr << "Assertion `" #condition "` failed in " << __FILE__ \ 
     << " line " << __LINE__ << ": " << message << std::endl; \ 
     std::exit(EXIT_FAILURE); \ 
    } \ 
} while (false) 
#else 
#define ASSERT(condition, message) do { } while(false) 
#endif 

Это по существу делает то, что мне нужно, для противной std::exit(EXIT_FAILURE); что серьезно нуждается в замене, за исключением. В его текущей форме я получаю двойные удаления и всевозможные гадости, которые запутывают сообщение утверждения.

Как я могу изящно выйти из ошибок утверждения в многопоточном приложении?

Возможно, мне следует отказаться от утверждения, а затем catch + return(1) от main()? (Я не уверен в последствиях этого, поэтому я полностью открыт для различных вариантов)

+2

Хм. 'Станд :: abort'? –

+2

Да, выведите исключение. Тем не менее, читайте об распространении исключений в многопоточной среде. –

+0

@KerrekSB - ty - я начну googling по теме – kfmfe04

ответ

1

Хотя это быстро и грязно, _exit отлично работает на большинстве платформ.

+0

+1 ty - это похоже на работу - не могли бы вы рассказать о том, что на самом деле происходит с _exit()? (Я также буду google), я мог бы использовать этот вызов в других контекстах, если я могу понять его ограничения. – kfmfe04

+0

Это полубесконечное, безусловное, беспроблемное прекращение вызывающего процесса. –