gpt4 book ai didi

c++ - 为什么 std::packaged_task 无效?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:19:21 27 4
gpt4 key购买 nike

使用 MSVC2012,

下面的代码将按预期编译和运行

std::packaged_task< int() > task( []()->int{ std::cout << "hello world" << std::endl; return 0; } );
std::thread t( std::move(task) );
t.join();

而下面的代码会编译运行失败

std::packaged_task< void() > task( [](){ std::cout << "hello world" << std::endl; } );
std::thread t( std::move(task) );
t.join();

为什么会这样?

编辑:作为解决方法,可以使用 std::promise 在返回 void 的函数上获取 std::future

std::promise<void> promise;
auto future = promise.get_future();
std::thread thread( [](std::promise<void> &p){ std::cout << "hello world" << std::endl; p.set_value(); }, std::move(promise) );
future.wait();

请注意,在 vs2012 库中有一个 std::thread 的错误,它强制您将 promise 作为左值引用传递并移动 promise,如果您按值传递 promise 或通过 r 值引用。据推测,这是因为实现使用了 std::bind() ,它的行为不符合预期。

最佳答案

这是 MSVC2012 中的错误。 MSVC2012 附带的线程库实现中存在不少错误。我在我的博客文章中发布了一个部分列表,将其与我的商业 Just::Thread 库进行比较:http://www.justsoftwaresolutions.co.uk/news/just-thread-v1.8.0-released.html

关于c++ - 为什么 std::packaged_task<void()> 无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14744588/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com