Распространение исключений между потоками в c ++ 0x - PullRequest
2 голосов
/ 29 марта 2011

Я использую gcc 4.5 и хочу перенести исключение в другой поток: http://www.open -std.org / jtc1 / sc22 / wg21 / docs /apers / 2007 / n2179.html

#include <stdexcept>
#include <iostream>
#include <thread>

struct Callable
{
    void operator()()
    {
        try
        {
            throw std::runtime_error("Bad things happened");
        }
        catch (...)
        {
            std::cout << "caught" << std::endl;
            e = std::current_exception();

            if (e == NULL)
            {
                std::cout << "inside NULL" << std::endl;
            }
        }
    }

    std::exception_ptr e;
};

int main()
{
    Callable c;

    std::thread t(c);
    t.join();

    if (c.e == NULL)
    {
        std::cout << "outside NULL" << std::endl;
    }
    else
    {
        std::rethrow_exception(c.e);
    }

    return 0;
}

Вывод, который я получаю:

caught
outside NULL

Кажется, e не NULL внутри потока, но тогда вне его ?!Что здесь не так?

1 Ответ

2 голосов
/ 29 марта 2011

Я понял это сам. std :: thread делает копию struct Callable first ...

Следующее работает как ожидалось:

#include <stdexcept>
#include <iostream>
#include <thread>

int main()
{
    std::exception_ptr e;

    std::thread t([&e]()
    {
        try
        {
            throw std::runtime_error("Bad things happened");
        }
        catch (...)
        {
            std::cout << "caught" << std::endl;
            e = std::current_exception();

            if (e == NULL)
            {
                std::cout << "inside NULL" << std::endl;
            }
        }
    });

    t.join();

    if (e == NULL)
    {
        std::cout << "outside NULL" << std::endl;
    }
    else
    {
        std::rethrow_exception(e);
    }

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...