gpt4 book ai didi

c++ - 使用 boost::future::then 在主线程中执行

转载 作者:太空狗 更新时间:2023-10-29 20:59:10 26 4
gpt4 key购买 nike

编译器:mingw4.8.2操作系统:win7 32位

#define BOOST_THREAD_PROVIDES_FUTURE
#define BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION

#include <boost/lexical_cast.hpp>
#include <boost/thread.hpp>
#include <boost/thread/future.hpp>

#include <iostream>
#include <string>

int main()
{

std::cout<<"main thread id : "<<boost::this_thread::get_id()<<std::endl;
boost::future<int> f1 = boost::async(boost::launch::async, []()
{
std::cout<<"async thread id : "<<boost::this_thread::get_id()<<std::endl;
return 123;
});
boost::future<std::string> f2 = f1.then(boost::launch::deferred, [](boost::future<int> f)
{
std::cout<<"then id : "<<boost::this_thread::get_id()<<std::endl;
return boost::lexical_cast<std::string>(f.get());
});

f2.wait();
}

结果:

main thread id : 3758
async thread id : 33b4
then id : 3824

如何让 lambda 表达式传递给“then”在主线程中运行?无论如何要求它在主线程中运行?如果没有简单的方法通过 boost 做到这一点,是否可以借助 Qt 进行异步等待(当 future 准备就绪时,发出信号并在主线程中运行函数)?

edit : f1.then 的目的

boost::async 可能会运行一些繁重的任务,如果我不让这个任务在另一个线程上运行,它很可能会阻塞 gui。任务完成后,我想告诉 gui 并执行一些与gui,这就是我使用 f1.then 的原因,因为这样我就不需要阻止函数。

编辑:看起来延迟可以工作

//cout has not thread safe guarantee, but adding mutex at here will cause dead lock...
std::cout<<"main thread id : "<<boost::this_thread::get_id()<<std::endl;
auto f1 = boost::async(boost::launch::async, [&]()
{
boost::this_thread::sleep(boost::posix_time::seconds( 5 ));
std::cout<<"async thread id : "<<boost::this_thread::get_id()<<std::endl;
return 123;
});
auto f2 = f1.then(boost::launch::deferred, [&](decltype(f1) f)
{
std::cout<<"then result : "<<f.get()<<std::endl;
std::cout<<"then id : "<<boost::this_thread::get_id()<<std::endl;
return std::string("result get");
});


for(size_t i = 0; i != 50; ++i){
std::cout<<i<<std::endl;
}

f2.wait();

最佳答案

template<typename F>
future<typename boost::result_of<F( future&)>::type>
then(F&& func); // EXTENSION
template<typename S, typename F>
future<typename boost::result_of<F( future&)>::type>
then(S& scheduler, F&& func); // EXTENSION NOT_YET_IMPLEMENTED
template<typename F>
future<typename boost::result_of<F( future&)>::type>
then(launch policy, F&& func); // EXTENSION

来自 future documentation .您应该使用函数的第三个版本。

f1.then(boost::launch::deferred, ...)

关于c++ - 使用 boost::future::then 在主线程中执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25327256/

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