std :: promise的向量抛出异常但boost :: promise却没有

时间:2015-12-07 02:45:53

标签: c++ c++11 boost future

问题:存储一系列承诺的正确方法是什么?

我使用g ++(Ubuntu 4.8.4-2ubuntu1~14.04)4.8.4和“-std = c ++ 11”。 (更新:现在升级到g ++ 5.3,请参阅注释)

以下代码在调用promise.set_value()时抛出异常。消息是“在抛出'std :: system_error'的实例后调用终止what():未知错误-1中止(核心转储)”

#include <vector>
#include <future>

int main()
{
    {   
        std::vector<std::promise<int>> q;
        std::promise<int> p;
        auto f = p.get_future();
        q.push_back(std::move(p));
        auto t1 = std::move(q.front());
        t1.set_value(10);
    }   
}

如果我用boost :: promise替换std :: promise,它可以正常工作

#include <vector>
#include <boost/thread/future.hpp>

int main()
{
    {   
        std::vector<boost::promise<int>> q;
        boost::promise<int> p;
        auto f = p.get_future();
        q.push_back(std::move(p));
        auto t1 = std::move(q.front());
        t1.set_value(10);
    }   
}

最令人惊讶的是,如果我只保留boost ::的声明,那么std :: promise :: set_value()会抛出异常(或者可能会被某个地方捕获?)在计划中承诺!

#include <vector>
#include <future>
#include <boost/thread/future.hpp>

int main()
{
    {   // this hides the exception thrown by promise::set_value()
        boost::promise<int> p;
    }   

    {   
        std::vector<std::promise<int>> q;
        std::promise<int> p;
        auto f = p.get_future();
        q.push_back(std::move(p));
        auto t1 = std::move(q.front());
        t1.set_value(10);
    }   
}

更新: 编译选项  -Wextra -Wall -Werror -std = c ++ 11 [是的,我添加了一个正确的main定义和介绍(void)argc和(void)argv上面的]

ldd输出

linux-vdso.so.1 =>  (0x00007fffe51fe000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fa542df1000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fa542bda000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa542813000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa54250d000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa54311f000)

0 个答案:

没有答案