3

从 boost::thread 获取退出代码的标准方法是什么?
文档似乎根本没有涉及这个主题。

4

3 回答 3

5

POSIX 不支持线程的返回码。我建议你使用 future:C++11 在标准库中提供了futures,或者如果你使用的是旧版本的 C++,Boost.Thread 库从 1.41 版本开始就已经很好地实现了 futures 。这为您提供了用于阻塞和非阻塞通信的通用语法,允许您返回任何类型的对象,并且蛋糕上的糖霜可以让您将异常传播到线程之外。

于 2009-11-13T10:38:08.567 回答
1

由于 Boost.Thread 复制了您传递给它的函子,David 的解决方案在任何实际示例中都不起作用。你基本上有两个选择:

  1. 分配退出代码数组并将对唯一退出代码的引用传递给每个仿函数的构造函数。非常直接地实施。
  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, 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;
    }
}

方法二:

#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;
}
于 2010-06-13T10:11:01.227 回答
-1

我不知道线程退出代码是否可用,因为这是特定于操作系统的。您可以通过执行以下操作来模拟传递退出代码或结果代码:

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

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

    processor.join();
    int result = x.result;
}
于 2009-11-11T16:45:39.600 回答