Повысить прерывание прерывания thread_interrupted () с MinGW gcc 4.4.0, хорошо с 3.4.5 - PullRequest
1 голос
/ 06 июля 2010

Сегодня я "играл с" потоками повышения в качестве учебного упражнения, и у меня есть рабочий пример, который я создал несколько месяцев назад (до того, как меня прервали и мне пришлось на некоторое время отказаться от многопоточности). ) это показывает необычное поведение.

Когда я изначально писал это, я использовал 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;
}

1 Ответ

0 голосов
/ 07 июля 2010

решаемая.

Оказывается, добавление флага компилятора -static-libgcc устраняет проблему с 4.4.0 (и не оказывает видимого влияния на 3.4.5) - или по крайней мере в этом случае программа возвращает ожидаемые результаты.

...