[英]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.