加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – std ::未来仍然延迟使用std :: packaging_task(VS11)

发布时间:2020-12-16 03:26:19 所属栏目:百科 来源:网络整理
导读:看来,除非你调用std :: async,否则std :: future将永远不会被设置为任何其他状态而不是future_status :: deferred,除非你调用get或wait将来. wait_for即使任务已经运行并存储结果,wait_until将继续阻止并返回future_status :: deferred. 这里有一个例子: #i
看来,除非你调用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)
}

我没有当前的C11标准,但30.6.9中的标准草案表示,当运行一个packed_task时,应该将结果存储在将来的共享状态.这不是很清楚是否包括设置预期的wait_until / wait_for行为.

以前有关于异地调用的这个领域VS11行为的问题:http://social.msdn.microsoft.com/Forums/hu/parallelcppnative/thread/4394f2c1-0404-40df-869b-f4fc36fc035c

此外,似乎其他编译器在这方面有问题:C++ 11 future_status::deferred not working

任何可能会更了解标准的人:这是预期的行为还是在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线程库的实现有几个错误.我写了几个 on my blog.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读