使用std::packaged_task(VS11)时,std::future仍然延迟
std::future still deferred when using std::packaged_task (VS11)
似乎除非您调用std::async
,否则std::future
永远不会设置为除future_status::deferred
之外的任何其他状态,除非您将来调用get
或wait
。wait_for
&即使任务已经运行并存储了结果,wait_until
也将继续不阻塞并返回future_status::deferred
。
这里有一个例子:
#include <future>
void main()
{
auto func = []() { return 5; };
auto asyncFuture = std::async(std::launch::async, func);
auto status = asyncFuture.wait_for(std::chrono::seconds(0)); // timeout (1)
auto deferredFuture = std::async(std::launch::deferred, func);
status = deferredFuture.wait_for(std::chrono::seconds(0)); // deferred (2)
std::packaged_task<int()> task(func);
auto packagedTaskFuture = task.get_future();
status = packagedTaskFuture.wait_for(std::chrono::seconds(0)); // deferred (2)
task();
status = packagedTaskFuture.wait_for(std::chrono::seconds(0)); // deferred (2)
packagedTaskFuture.wait();
status = packagedTaskFuture.wait_for(std::chrono::seconds(0)); // ready (0)
}
我没有当前的C++11标准,但30.6.9中的标准草案规定,当运行packaged_task
时,它应该将结果存储在未来的共享状态中。目前还不清楚这是否包括设置预期的wait_until
/wait_for
行为。
之前,VS11在此区域中的行为与async
调用有关,存在问题:http://social.msdn.microsoft.com/Forums/hu/parallelcppnative/thread/4394f2c1-0404-40df-869b-f4fc36fc035c
此外,似乎其他编译器在这方面也存在问题:C++11 future_status::deferred不工作
任何可能更了解该标准的人:这是预期的行为还是VS11中的实现存在问题?
更新:我不知怎么错过了以下报告:http://connect.microsoft.com/VisualStudio/feedback/details/761829/c-11-unexpected-behavior-for-std-future-wait-for-and-std-packaged-task
这是VS2012的一个问题。这也不是唯一的问题——他们对C++11线程库的实现有几个错误。我在博客上写了一些。
- 架构决策:返回std::future还是提供回调
- std::p romise::set_value() 和 std::future::wait() 是否提供内存围栏?
- 修改在 std::future 的 lambda 中引用捕获的值
- C++ std::future没有被调用
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- Make zmqpp::socket::connect a std::future
- std::future可以比std::promise活得更长吗
- std::future::get()或std::future::wait()是std::thread::join()的替
- 当 std::future 准备好被检索时发出信号主线程
- 当多次调用时,"std::future::then"的行为是什么?
- 使用 std::future 的不完整类型无效使用
- 为什么 std::future::wait_for 的行为不符合预期?
- 是什么给了 std::future 一些共享状态
- STD :: Future no_state异常与断言
- 标准是否保证在移动std::p ackaged_task后安全使用std::future?
- 将 Boost 链与 std::future 结合使用
- 删除 std::future 和 std::p romise 的空白专用化
- std::future给了我错误3,我做错了什么
- 如何在 std::future 的向量中调用异步函数
- 在 std::future::unwrap() 和 std::future::get() 中竞争