簡體   English   中英

boost :: future :: then()不會在將來阻止破壞時阻止

[英]boost::future::then() not returning future that blocks on destruction

我編寫了這個示例代碼來測試我的應用程序中使用的boost::future continuation。

#include <iostream>
#include <functional>
#include <unistd.h>
#include <exception>

#define BOOST_THREAD_PROVIDES_FUTURE
#define BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION

#include <boost/thread/future.hpp>

void magicNumber(std::shared_ptr<boost::promise<long>> p)
{
    sleep(5);
    p->set_value(0xcafebabe);
}

boost::future<long> foo()
{
    std::shared_ptr<boost::promise<long>> p = 
    std::make_shared<boost::promise<long>>();

    boost::future<long> f = p->get_future();

    boost::thread t([p](){magicNumber(p);});

    t.detach();

    return f;
}

void bar()
{
    auto f = foo();
    f.then([](boost::future<long> f) { std::cout << f.get() << std::endl; });
    std::cout << "Should have blocked?" << std::endl; 
}

int main()
{   
    bar();

    sleep (6);

    return 0;
}

在使用boost版本1.64.0_1進行編譯,鏈接和運行時,我得到以下輸出:

Should have blocked?
3405691582

但根據boost::future::then的文檔在這里 應該在函數bar()中的f.then()處阻止執行,因為boost::future<void>類型的臨時變量應該在銷毀時阻塞,輸出應該是

3405691582
Should have blocked?

但是在我的應用程序中,對f.then()的調用阻止了執行,直到不調用continuation。 這里發生了什么?

請注意,未來將使用的析構函數永遠堵住唯一的一次,當你用它來記錄為std::async用的推出政策launch::async

請參閱為什么未來的析構函數從`std :: async`阻止返回?

答案列出了圍繞這一主題進行的許多討論。 提議N3776進入C ++ 14:

本文提供了用於實現積極的SG1吸管輪詢的建議措辭,以澄清~future~shared_future除非可能存在異步,否則不會阻止。

cppreference.com文件std :: async

在此輸入圖像描述

您的代碼從未使用異步,因此如果任何未來的派生阻止破壞,那將會令人驚訝。

更一般地說,很明顯,共識是阻止破壞是一個不幸的設計疣,而不是你期望在更新的擴展上引入的東西(例如.then continuation)。

我只能假設這是一個文檔錯誤的情況下的措辭

  • 返回的期貨表現為從boost :: async返回的期貨,從那時返回的未來對象的析構函數將阻塞。 這可能會在未來版本中發生變化。

應該刪除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM