2010-10-11 3 views
1


Я начал играть с повышение :: потоков, но я вроде застрял с этой проблемой:Использование исключений внутри подталкивание :: Тема

Я не понимаю, почему эта программа вылетает как в скором времени, когда исключение будет выброшено, потому что я пытаюсь поймать его в потоке. Я думал, что можно работать с исключениями, если обработка происходит в том же потоке, что и метание?

#include <boost/thread.hpp> 
#include <exception> 

using namespace std; 

void doWork(); 
void thrower(); 

int main(int argc, char** argv){ 
boost::thread worker(doWork); 
worker.join(); 
return 0; 
} 

void doWork(){ 
try{ 
    thrower(); 
} 
catch(const exception &e){ 
    //handle exception 
} 
} 
void thrower(){ 
// program terminates as soon as the exception is thrown 
throw exception(); 
} 

Дополнительная информация:
* Использование Mingw32
* Повышение v.1.44
* Связывание динамически с многопоточной длл отладки Версия нити Lib

+0

Это не будет даже скомпилировать без соответствующих деклараций вперед и 'использование имен std'. Но если я их добавлю, он отлично работает на Ubuntu Linux w/Boost 1.40. –

+0

извините, это уменьшенная версия кода, чтобы отобразить проблему. Вы связывали статически или динамически? – zitroneneis

+0

Прекрасно работает для меня. Mac OS X с использованием Boost 1.44 динамически связана. –

ответ

2

Я нашел проблему: Это ошибка в библиотеке boost, которая возникает только при работе с версией minGW, новее чем 3.17. Boost trac ticket #4258

После применения предложенного метода решения проблемы и установки препроцессора Определения BOOST_THREAD_USE_LIB Теперь я могу связать против статической библиотеки, и я могу работать с исключениями, до тех пор, как они пойманы в том же потоке, что проливает их.

Танк вас за ваши комментарии

0

В приложениях, состоящей из нескольких общих библиотек вы, возможно, должны быть очень осторожны в отношении видимости ваших исключений. gcc не делает информацию RTTI для исключений, видимых извне общей библиотеки по умолчанию, в результате чего исключения, которые пересекаются через границы разделяемой библиотеки, «исчезают». См. here для подробного описания и возможных подводных камней.

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

+0

Вау, это интересно. К счастью для меня это не проблема в моем случае. Большое спасибо за идею в любом случае – zitroneneis