问题:存储一系列承诺的正确方法是什么?
我使用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)