boost :: thread выходной код? - PullRequest
       8

boost :: thread выходной код?

3 голосов
/ 11 ноября 2009

Каков стандартный способ получения кода выхода из boost :: thread?
Документы , кажется, вообще не затрагивают эту тему.

Ответы [ 3 ]

5 голосов
/ 13 ноября 2009

POSIX не поддерживает коды возврата из потоков. Я рекомендую вам использовать будущее: C ++ 11 предоставляет фьючерсы в стандартной библиотеке , или, если вы используете старую версию C ++, библиотека Boost.Thread имеет отличная реализация фьючерсов с версии 1.41 . Это дает вам общий синтаксис как для блокирующего, так и для неблокирующего взаимодействия, позволяет вам возвращать объекты любого типа, и, как глазурь на торте, позволяет распространять исключения из потоков.

1 голос
/ 13 июня 2010

Поскольку Boost.Thread копирует функтор, который вы передаете, решение Дэвида не сработает ни в одном реальном примере. У вас есть два варианта:

  1. Выделите массив кодов выхода и передайте ссылку на уникальный код выхода в конструктор каждого функтора. Довольно просто реализовать.
  2. Если вы создаете только один поток из определенного функтора, тогда функтор может содержать общий интеллектуальный указатель на динамически размещенный существующий код, который затем может быть прочитан исходным объектом функтора.

Вот примеры каждого метода:

Метод 1:

#include <boost/thread/thread.hpp>
#include <boost/thread/xtime.hpp>
#include <boost/shared_ptr.hpp>

#include <iostream>

struct thread_alarm
{
    thread_alarm(int secs, int &ec) : m_secs(secs), exit_code(ec) {  }
    void operator()()
    {
        boost::xtime xt;
        boost::xtime_get(&xt, boost::TIME_UTC);
        xt.sec += m_secs;

        boost::thread::sleep(xt);

        std::cout << "alarm sounded..." << std::endl;

        exit_code = 0xDEADBEEF;
    }

    int m_secs;
    int &exit_code;
};

typedef boost::shared_ptr<boost::thread> BoostThreadPtr;

int main(int argc, char* argv[])
{
    int secs = 1;
    int exit_codes[10];

    BoostThreadPtr threads[10];

    for (int i = 0; i<10; ++i) {
        std::cout << "setting alarm for 1 seconds..." << std::endl;
        thread_alarm alarm(secs, exit_codes[i]);
        threads[i] = BoostThreadPtr(new boost::thread(alarm));
    }

    for (int i = 0; i<10; ++i) {
        threads[i]->join();
        std::cout << "exit code == 0x" << std::hex << exit_codes[i] << std::endl;
    }
}

Метод 2:

#include <boost/thread/thread.hpp>
#include <boost/thread/xtime.hpp>
#include <boost/shared_ptr.hpp>

#include <iostream>

struct thread_alarm
{
    thread_alarm(int secs) : m_secs(secs) { exit_code = IntPtr( new int(0) ); }
    void operator()()
    {
        boost::xtime xt;
        boost::xtime_get(&xt, boost::TIME_UTC);
        xt.sec += m_secs;

        boost::thread::sleep(xt);

        std::cout << "alarm sounded..." << std::endl;

        *exit_code = 0xDEADBEEF;
    }

    int m_secs;

    typedef boost::shared_ptr<int> IntPtr;
    IntPtr exit_code;
};

int main(int argc, char* argv[])
{
    int secs = 5;
    std::cout << "setting alarm for 5 seconds..." << std::endl;
    thread_alarm alarm(secs);
    boost::thread thrd(alarm);
    thrd.join();
    std::cout << "exit code == 0x" << std::hex << *(alarm.exit_code) << std::endl;
}
0 голосов
/ 11 ноября 2009

Я не знаю, доступен ли код завершения потока, так как это зависит от операционной системы. Вы можете смоделировать передачу кода завершения или кода результата, выполнив что-то вроде этого:

struct callable {
    int result;
    void operator()()
    {
        result = 42;
    }
};

void process_on_thread() {
    callable x;
    boost::thread processor(x);

    processor.join();
    int result = x.result;
}
...