C – Boost.Promise,Boost.Unique_Future和Move Semantics
发布时间:2020-12-16 09:39:38 所属栏目:百科 来源:网络整理
导读:我正在听Bartosz Milewski here的一些教程,我发现它非常有用. 但是,由于作者使用了C11线程标准的 just::thread实现(我还没有),我现在决定使用boost线程,因为本教程的作者说这样做很简单.这似乎是本系列前三个教程的情况,但我遇到了第四个问题.这是我的代码:
我正在听Bartosz Milewski
here的一些教程,我发现它非常有用.
但是,由于作者使用了C11线程标准的 just::thread实现(我还没有),我现在决定使用boost线程,因为本教程的作者说这样做很简单.这似乎是本系列前三个教程的情况,但我遇到了第四个问题.这是我的代码: #include <iostream> #include <cassert> #include <boostthread.hpp> #include <boostthreadfuture.hpp> void thFun(boost::promise<std::string> & prms) { std::string str("Hi from future!"); prms.set_value(str); } int main() { boost::promise<std::string> prms; boost::unique_future<std::string> fut = prms.get_future(); boost::thread th(&thFun,std::move(prms)); // error C2248: 'boost::promise<R>::promise' : cannot access private member declared in class 'boost::promise<R>' std::cout << "Hi from main!"; std::string str = fut.get(); std::cout << str << std::endl; th.join(); return 0; } 以下行似乎引发了一个我不明白的问题: boost::thread th(&thFun,std::move(prms)); 编译器抱怨的地方:
任何人都可以建议问题可能是什么? 提前致谢! 解决方法
boost :: thread使用boost :: bind来处理带有附加参数的线程函数,这要求它们是可复制的.您可以通过指针或引用传递promise(使用例如boost :: ref),但这需要该对象超过该线程.在这个例子中它是可以的,但是对于一个分离的线程,或一个比启动它的函数更长的线程,这将阻止在堆栈上使用boost :: promise对象.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |