c – 我可以在不等待未来限制的情况下使用std :: async吗?
发布时间:2020-12-16 09:11:03 所属栏目:百科 来源:网络整理
导读:高水平 我想在异步模式下调用一些没有返回值的函数而不等待它们完成.如果我使用std :: async,则在任务结束之前,未来的对象不会被破坏,这使得调用在我的情况下不同步. 例 void sendMail(const std::string address,const std::string message){ //sending the
高水平
我想在异步模式下调用一些没有返回值的函数而不等待它们完成.如果我使用std :: async,则在任务结束之前,未来的对象不会被破坏,这使得调用在我的情况下不同步. 例 void sendMail(const std::string& address,const std::string& message) { //sending the e-mail which takes some time... } myResonseType processRequest(args...) { //Do some processing and valuate the address and the message... //Sending the e-mail async auto f = std::async(std::launch::async,sendMail,address,message); //returning the response ASAP to the client return myResponseType; } //<-- I'm stuck here until the async call finish to allow f to be destructed. // gaining no benefit from the async call. 我的问题是 >有没有办法克服这个限制? 注意: 谢谢. 解决方法
您可以将未来移动到全局对象中,因此当本地future的析构函数运行时,它不必等待异步线程完成.
std::vector<std::future<void>> pending_futures; myResonseType processRequest(args...) { //Do some processing and valuate the address and the message... //Sending the e-mail async auto f = std::async(std::launch::async,message); // transfer the future's shared state to a longer-lived future pending_futures.push_back(std::move(f)); //returning the response ASAP to the client return myResponseType; } 注:如果异步线程引用processRequest函数中的任何局部变量,则这不安全.
这实际上是不符合的,标准明确表示使用std :: launch :: async运行的任务必须像在新线程中一样运行,因此任何线程局部变量都不能从一个任务持久存在.但通常并不重要. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |