Сегодня я "играл с" потоками повышения в качестве учебного упражнения, и у меня есть рабочий пример, который я создал несколько месяцев назад (до того, как меня прервали и мне пришлось на некоторое время отказаться от многопоточности). ) это показывает необычное поведение.
Когда я изначально писал это, я использовал MingW gcc 3.4.5, и это работало. Сейчас я использую 4.4.0, а это не так - кстати, я снова попробовал использовать 3.4.5 (я сохранил эту версию в отдельной папке, когда я установил 4.4.0), и она все еще работает.
Код находится в конце вопроса; в итоге то, что он делает, это запускает два Counter
объекта в двух дочерних потоках (эти объекты просто увеличивают переменную, затем спят немного и повторяют до бесконечности - они рассчитывают), основной поток ожидает Пользователь через cin.get()
, а затем прерывает оба потока, ждет их присоединения, а затем выводит результат обоих счетчиков.
В соответствии с 3.4.5 он работает как ожидалось.
В соответствии с 4.4.0 он работает до ввода пользователя, а затем умирает с сообщением, подобным приведенному ниже - кажется, что исключения прерывания убивают весь процесс?
прекращение вызова после выброса экземпляра '
Это приложение запросило Runtime прекратить его необычным способом.
Пожалуйста, обратитесь в службу поддержки приложения для получения дополнительной информации.
повышение :: thread_interrupted '
Это приложение запросило среду выполнения прекратить его необычным способом.
Пожалуйста, обратитесь в службу поддержки приложения для получения дополнительной информации.
Из того, что я прочитал, я думаю, что любое (?) Неперехваченное исключение, которое может распространяться из дочернего потока, приведет к остановке процесса? Но я ловлю прерывания здесь, не так ли? По крайней мере, я кажется при использовании 3.4.5.
Итак, во-первых, я понял, как работает прерывание?
И какие-либо предложения относительно того, что происходит и как это исправить?
Код:
#include <iostream>
#include <boost/thread/thread.hpp>
#include <boost/date_time.hpp>
//fixes a linker error for boost threads in 4.4.0 (not needed for 3.4.5)
//found via Google, so not sure on validity - but does fix the link error.
extern "C" void tss_cleanup_implemented() { }
class CCounter
{
private:
int& numberRef;
int step;
public:
CCounter(int& number,int setStep) : numberRef(number) ,step(setStep) { }
void operator()()
{
try
{
while( true )
{
boost::posix_time::milliseconds pauseTime(50);
numberRef += step;
boost::this_thread::sleep(pauseTime);
}
}
catch( boost::thread_interrupted const& e )
{
return;
}
}
};
int main( int argc , char *argv[] )
{
try
{
std::cout << "Starting counters in secondary threads.\n";
int number0 = 0,
number1 = 0;
CCounter counter0(number0,1);
CCounter counter1(number1,-1);
boost::thread threadObj0(counter0);
boost::thread threadObj1(counter1);
std::cout << "Press enter to stop the counters:\n";
std::cin.get();
threadObj0.interrupt();
threadObj1.interrupt();
threadObj0.join();
threadObj1.join();
std::cout << "Counter stopped. Values:\n"
<< number0 << '\n'
<< number1 << '\n';
}
catch( boost::thread_interrupted& e )
{
std::cout << "\nThread Interrupted Exception caught.\n";
}
catch( std::exception& e )
{
std::cout << "\nstd::exception thrown.\n";
}
catch(...)
{
std::cout << "\nUnexpected exception thrown.\n"
}
return EXIT_SUCCESS;
}