Boost 线程退出代码?

Boost 线程退出代码?,boost,multithreading,exit-code,Boost,Multithreading,Exit Code,从boost::thread获取退出代码的标准方法是什么? 我不知道线程退出代码是否可用,因为它是特定于操作系统的。您可以通过如下操作模拟传递退出代码或结果代码: struct callable { int result; void operator()() { result = 42; } }; void process_on_thread() { callable x; boost::thread processor(x);

从boost::thread获取退出代码的标准方法是什么?

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

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

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

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

POSIX不支持来自线程的返回代码。我建议你使用未来:或者如果你在C++的老版本上,那么它已经有了一个很好的期货实现。这为阻塞通信和非阻塞通信提供了一种通用语法,允许您返回任何类型的对象,并且作为蛋糕上的糖霜,允许您将异常传播到线程之外。

自从Boost.Thread复制了您传递的函子之后,David的解决方案在任何实际示例中都不起作用。您基本上有两种选择:

  • 分配一个退出代码数组,并将对唯一退出代码的引用传递到每个函子的构造函数中。实现起来非常简单
  • 如果您仅从特定函子创建单个线程,则函子可以保存指向动态分配的exist代码的共享智能指针,然后原始函子对象可以读取该代码 以下是每种方法的示例:

    方法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;
        }
    }
    
    #包括
    #包括
    #包括
    #包括
    结构线程报警
    {
    线程报警(int secs,int&ec):m secs(secs),退出代码(ec){}
    void运算符()()
    {
    boost::xtime xt;
    boost::xtime\u get(&xt,boost::TIME\u UTC);
    xt.sec+=毫微秒;
    boost::thread::sleep(xt);
    
    std::cout为了使其工作,您必须在引用包装器中传递x,因为boost::thread的构造函数复制参数。
    #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;
    }