C ++ 11期货/承诺中没有状态错误

时间:2013-11-26 19:24:48

标签: c++ multithreading c++11 future

我对C ++中期货/承诺的行为感到有点困惑。

代码如下

 std::future<std::string> method() {
        std::promise<std::string> pr;
        std::future<std::string> ft = pr.get_future();

        std::thread t(                   
            [](std::promise<std::string> p)  
            {                      
                p.set_value("z");  
            },                     
            std::move(pr)          
        );                       
        t.detach();                    

        return std::move(ft);          
 }

当我运行代码时,__throw_future_error((int)future_errc::no_state);

引发异常std::future<std::string> ft = pr.get_future();

知道为什么会这样吗?

编辑:

所以,我有一个展示问题的最小例子。 Coliru(使用g ++ 4.8和更新的stdlib)似乎运行得很好,但是当它涉及到我的工作站时它会失败。

http://coliru.stacked-crooked.com/a/711e182594cbe7d3

我正在编译

# gcc 4.7.3
g++ -g -std=c++11 -lpthread t.cpp -o t 

# clang 3.2.1
clang++ -g -std=c++11 -lpthread t.cpp -o t

libstdc ++版本是3.4.17

Workstation是Linux Mint 15

1 个答案:

答案 0 :(得分:1)

这看起来像个错误。指定promise的默认构造函数来构造promise的共享状态。从future返回的pr.get_future()应该引用该共享状态。

-stdlib=libc++是您的选择吗?